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.
This commit is contained in:
2026-07-04 23:44:18 +02:00
parent 9520191bde
commit dec431579e
5 changed files with 45 additions and 7 deletions
+2 -1
View File
@@ -16,7 +16,8 @@
"shell": "scripts/chromium-shell.sh", "shell": "scripts/chromium-shell.sh",
"electron": "scripts/electron-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: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": { "dependencies": {
"@mlightcad/libredwg-web": "^0.7.7", "@mlightcad/libredwg-web": "^0.7.7",
+2
View File
@@ -1488,8 +1488,10 @@ dependencies = [
name = "geometry" name = "geometry"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"console_error_panic_hook",
"serde", "serde",
"serde_json", "serde_json",
"wasm-bindgen",
] ]
[[package]] [[package]]
+8 -6
View File
@@ -1,10 +1,12 @@
[workspace] [workspace]
members = [".", "geometry"] members = ["."]
# render2d/render3d sind eigenstaendige Crates (jeweils eigener [workspace]), damit # render2d/render3d/geometry sind eigenstaendige Crates, damit sie headless ohne
# sie headless ohne Tauri-Toolchain baubar/testbar bleiben. Sie liegen zwar im # Tauri-Toolchain UND per wasm-pack (Feature "web") zu WASM baubar bleiben. Sie
# src-tauri-Baum, gehoeren aber NICHT zum cad-tauri-Workspace — hier ausschliessen, # liegen zwar im src-tauri-Baum, gehoeren aber NICHT zum cad-tauri-Workspace —
# damit `cad-tauri` sie dennoch per Pfad als (optionale) Abhaengigkeit nutzen kann. # hier ausschliessen, damit `cad-tauri` sie dennoch per Pfad als Abhaengigkeit
exclude = ["render2d", "render3d"] # 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] [package]
name = "cad-tauri" name = "cad-tauri"
+19
View File
@@ -2,9 +2,28 @@
name = "geometry" name = "geometry"
version = "0.1.0" version = "0.1.0"
edition = "2021" 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] [dependencies]
serde = { version = "1", features = ["derive"] } 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. # Nur fuers Paritaets-Beispiel (examples/parity.rs) — JSON von stdin lesen.
[dev-dependencies] [dev-dependencies]
+14
View File
@@ -9,6 +9,20 @@
use serde::{Deserialize, Serialize}; 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<WallCuts>`.
#[cfg(feature = "web")]
#[wasm_bindgen::prelude::wasm_bindgen]
pub fn compute_joins_json(input_json: &str) -> Result<String, wasm_bindgen::JsValue> {
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)] #[derive(Serialize, Deserialize, Clone, Copy)]
pub struct Vec2 { pub struct Vec2 {
pub x: f64, pub x: f64,