From dec431579e10bb859751ceff5e60b9fbae8672f3 Mon Sep 17 00:00:00 2001 From: Karim Date: Sat, 4 Jul 2026 23:44:18 +0200 Subject: [PATCH] geometry-Crate zu WASM baubar (Feature web, compute_joins_json); aus cad-tauri-Workspace ausgeschlossen Erster Schritt der Rust-Kern-Migration: die Join-Geometrie wird per wasm-pack zu WASM gebaut (build:geometry) und exportiert compute_joins_json (JSON rein/raus). Damit kann das TS-Frontend kuenftig die EINE Rust-Implementierung aufrufen statt des TS-Duplikats. Crate wie render2d/render3d aus dem Workspace excludet, bleibt per Pfad-Dep fuer den nativen Host nutzbar. Verhalten unveraendert (noch nicht verdrahtet). geometry cargo test 8/8, cad-tauri cargo check ok. --- package.json | 3 ++- src-tauri/Cargo.lock | 2 ++ src-tauri/Cargo.toml | 14 ++++++++------ src-tauri/geometry/Cargo.toml | 19 +++++++++++++++++++ src-tauri/geometry/src/lib.rs | 14 ++++++++++++++ 5 files changed, 45 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 964373f..5a4b1e3 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "shell": "scripts/chromium-shell.sh", "electron": "scripts/electron-shell.sh", "build:engine": "wasm-pack build src-tauri/render2d --release --target web --out-dir ../../src/engine/pkg --out-name render2d --no-default-features --features web", - "build:engine3d": "wasm-pack build src-tauri/render3d --release --target web --out-dir ../../src/engine/pkg3d --out-name render3d --no-default-features --features web" + "build:engine3d": "wasm-pack build src-tauri/render3d --release --target web --out-dir ../../src/engine/pkg3d --out-name render3d --no-default-features --features web", + "build:geometry": "wasm-pack build src-tauri/geometry --release --target web --out-dir ../../src/engine/pkgGeometry --out-name geometry --no-default-features --features web" }, "dependencies": { "@mlightcad/libredwg-web": "^0.7.7", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 1418ef6..211ee98 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1488,8 +1488,10 @@ dependencies = [ name = "geometry" version = "0.1.0" dependencies = [ + "console_error_panic_hook", "serde", "serde_json", + "wasm-bindgen", ] [[package]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 96ade35..4cd2716 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,10 +1,12 @@ [workspace] -members = [".", "geometry"] -# render2d/render3d sind eigenstaendige Crates (jeweils eigener [workspace]), damit -# sie headless ohne Tauri-Toolchain baubar/testbar bleiben. Sie liegen zwar im -# src-tauri-Baum, gehoeren aber NICHT zum cad-tauri-Workspace — hier ausschliessen, -# damit `cad-tauri` sie dennoch per Pfad als (optionale) Abhaengigkeit nutzen kann. -exclude = ["render2d", "render3d"] +members = ["."] +# render2d/render3d/geometry sind eigenstaendige Crates, damit sie headless ohne +# Tauri-Toolchain UND per wasm-pack (Feature "web") zu WASM baubar bleiben. Sie +# liegen zwar im src-tauri-Baum, gehoeren aber NICHT zum cad-tauri-Workspace — +# hier ausschliessen, damit `cad-tauri` sie dennoch per Pfad als Abhaengigkeit +# nutzen kann. geometry: neu ausgeschlossen (war Member), seit es zu WASM gebaut +# wird und das TS-Frontend die Joins direkt per WASM aufruft (statt TS-Duplikat). +exclude = ["render2d", "render3d", "geometry"] [package] name = "cad-tauri" diff --git a/src-tauri/geometry/Cargo.toml b/src-tauri/geometry/Cargo.toml index 05542fc..23747fe 100644 --- a/src-tauri/geometry/Cargo.toml +++ b/src-tauri/geometry/Cargo.toml @@ -2,9 +2,28 @@ name = "geometry" version = "0.1.0" edition = "2021" +description = "Serde-only Geometrie-Kern (Wand-Verschneidungen/Joins) — headless und per wasm-pack (Feature \"web\") zu WASM baubar; Single Source of Truth fuer TS + nativen Host." + +# cdylib: von wasm-pack (Feature "web") fuer das .wasm-Modul benoetigt. rlib: +# damit die Crate weiterhin als Pfad-Abhaengigkeit (cad-tauri) und im Test-Build +# nutzbar bleibt. Der cdylib-Artefakt-Build auf nativen Zielen ist harmlos (leere +# Export-Oberflaeche ohne Feature "web"). Muster: render2d/render3d. +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# Standard: reine serde-Geometrie, headless per `cargo test` pruefbar. +default = [] +# Browser-Bindings: dieselbe Geometrie hinter einer wasm-bindgen-Fassade +# (`compute_joins_json`), aus TS via wasm-pack aufgerufen. Baut nur fuer +# target wasm32-unknown-unknown sinnvoll. Muster: render3d/Cargo.toml. +web = ["dep:wasm-bindgen", "dep:serde_json", "dep:console_error_panic_hook"] [dependencies] serde = { version = "1", features = ["derive"] } +serde_json = { version = "1", optional = true } +wasm-bindgen = { version = "0.2", optional = true } +console_error_panic_hook = { version = "0.1", optional = true } # Nur fuers Paritaets-Beispiel (examples/parity.rs) — JSON von stdin lesen. [dev-dependencies] diff --git a/src-tauri/geometry/src/lib.rs b/src-tauri/geometry/src/lib.rs index 56471f7..985aab7 100644 --- a/src-tauri/geometry/src/lib.rs +++ b/src-tauri/geometry/src/lib.rs @@ -9,6 +9,20 @@ use serde::{Deserialize, Serialize}; +/// Browser-Fassade (Feature "web"): JSON rein/raus, damit das TS-Frontend die +/// EINE Rust-Join-Implementierung per wasm-pack aufrufen kann (Single Source of +/// Truth statt TS-Duplikat). `input_json` = serialisiertes `JoinInput`, Rueckgabe +/// = serialisiertes `Vec`. +#[cfg(feature = "web")] +#[wasm_bindgen::prelude::wasm_bindgen] +pub fn compute_joins_json(input_json: &str) -> Result { + console_error_panic_hook::set_once(); + let input: JoinInput = serde_json::from_str(input_json) + .map_err(|e| wasm_bindgen::JsValue::from_str(&e.to_string()))?; + let out = compute_joins(input); + serde_json::to_string(&out).map_err(|e| wasm_bindgen::JsValue::from_str(&e.to_string())) +} + #[derive(Serialize, Deserialize, Clone, Copy)] pub struct Vec2 { pub x: f64,