diff --git a/gpx-rs/Cargo.lock b/gpx-rs/Cargo.lock index 3f49f0782..68170e416 100644 --- a/gpx-rs/Cargo.lock +++ b/gpx-rs/Cargo.lock @@ -104,6 +104,7 @@ name = "gpx-rs" version = "0.1.0" dependencies = [ "chrono", + "js-sys", "quick-xml", "uuid", "wasm-bindgen", @@ -135,9 +136,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ "cfg-if", "futures-util", @@ -245,6 +246,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "unicode-ident" version = "1.0.24" @@ -264,9 +276,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -277,9 +289,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -287,22 +299,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] @@ -328,7 +340,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -339,7 +351,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] diff --git a/gpx-rs/Cargo.toml b/gpx-rs/Cargo.toml index 6d290ddd2..b7c4c929a 100644 --- a/gpx-rs/Cargo.toml +++ b/gpx-rs/Cargo.toml @@ -8,6 +8,7 @@ crate-type = ["cdylib"] [dependencies] chrono = "0.4.45" +js-sys = "0.3.106" quick-xml = "0.42.0" uuid = {version = "1.26.1", features = ["v4", "js"]} wasm-bindgen = "0.2" diff --git a/gpx-rs/README.md b/gpx-rs/README.md new file mode 100644 index 000000000..447671d57 --- /dev/null +++ b/gpx-rs/README.md @@ -0,0 +1,3 @@ +``` +wasm-pack build --target bundler +``` diff --git a/gpx-rs/src/engine.rs b/gpx-rs/src/engine.rs index bdee4babc..9180f825c 100644 --- a/gpx-rs/src/engine.rs +++ b/gpx-rs/src/engine.rs @@ -1,5 +1,6 @@ use std::rc::Rc; +use js_sys::Function; use uuid::Uuid; use wasm_bindgen::prelude::*; @@ -16,21 +17,23 @@ use crate::{ // - update separate statistics // - update selection // - update selection statistics -// - notify UI (changed files, updated selection, new stats) +// - notify UI through callback (changed files, updated selection, new stats) #[wasm_bindgen] -pub struct Controller { +pub struct Engine { stack: Stack, selection: Selection, + callback: Function, } #[wasm_bindgen] -impl Controller { +impl Engine { #[wasm_bindgen(constructor)] - pub fn new() -> Self { + pub fn new(callback: Function) -> Self { Self { stack: Default::default(), selection: Default::default(), + callback, } } @@ -52,6 +55,7 @@ impl Controller { true }); } + let _ = self.callback.call1(&JsValue::NULL, &JsValue::from("done!")); } #[wasm_bindgen] diff --git a/website/src/lib/controller.ts b/website/src/lib/controller.ts deleted file mode 100644 index 2ab254432..000000000 --- a/website/src/lib/controller.ts +++ /dev/null @@ -1,10 +0,0 @@ -class Engine { - _engine: Writable; - - constructor() { - this._engine = null; - import('gpx-rs').then((wasm) => { - this._engine = new wasm.Controller(); - }); - } -} diff --git a/website/src/lib/engine.ts b/website/src/lib/engine.ts new file mode 100644 index 000000000..95e5517ce --- /dev/null +++ b/website/src/lib/engine.ts @@ -0,0 +1,22 @@ +import { writable, type Subscriber, type Writable } from 'svelte/store'; + +class Engine { + _engine: Writable; + + constructor() { + this._engine = writable(null); + import('gpx-rs').then((wasm) => { + this._engine.set(new wasm.Engine(this.onUpdate)); + }); + } + + subscribe(run: Subscriber, invalidate?: () => void) { + return this._engine.subscribe(run, invalidate); + } + + onUpdate(message: String) { + console.log('message from WASM: ' + message); + } +} + +export const engine = new Engine();