diff --git a/Cargo.lock b/Cargo.lock index c0ef9a3..04016b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -288,6 +288,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -315,6 +321,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f47b57fc4521e3cae26a4d45b5227f8fadee4c345be0fefd8d5d1711afb8aeb9" +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + [[package]] name = "ashpd" version = "0.8.1" @@ -517,7 +529,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.32.2", "rustc-demangle", ] @@ -679,6 +691,83 @@ dependencies = [ "serde", ] +[[package]] +name = "cap-fs-ext" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc2d2954524be4866aaa720f008fba9995de54784957a1b0e0119992d6d5e52" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes", + "windows-sys 0.52.0", +] + +[[package]] +name = "cap-net-ext" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799c81d79ea9c71a1438efd417c788214bc9e7986046d3710b6bbe60da4d8275" +dependencies = [ + "cap-primitives", + "cap-std", + "rustix", + "smallvec 1.13.2", +] + +[[package]] +name = "cap-primitives" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00172660727e2d7f808e7cc2bfffd093fdb3ea2ff2ef819289418a3c3ffab5ac" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes", + "ipnet", + "maybe-owned", + "rustix", + "windows-sys 0.52.0", + "winx", +] + +[[package]] +name = "cap-rand" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "270f1d341a2afc62604f8f688bee4e444d052b7a74c1458dd3aa7efb47d4077f" +dependencies = [ + "ambient-authority", + "rand 0.8.5", +] + +[[package]] +name = "cap-std" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd9187bb3f7478a4c135ea10473a41a5f029d2ac800c1adf64f35ec7d4c8603" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes", + "rustix", +] + +[[package]] +name = "cap-time-ext" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91666f31e30c85b1d2ee8432c90987f752c45f5821f5638027b41e73e16a395b" +dependencies = [ + "ambient-authority", + "cap-primitives", + "iana-time-zone", + "once_cell", + "rustix", + "winx", +] + [[package]] name = "cargo-platform" version = "0.1.8" @@ -709,7 +798,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml 0.8.2", + "toml 0.8.14", ] [[package]] @@ -717,6 +806,11 @@ name = "cc" version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] [[package]] name = "cesu8" @@ -788,6 +882,12 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + [[package]] name = "cocoa" version = "0.25.0" @@ -911,6 +1011,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpp_demangle" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -920,6 +1029,117 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-bforest" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-bitset" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-codegen" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "bumpalo", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-isle", + "gimli", + "hashbrown 0.14.5", + "log", + "regalloc2", + "rustc-hash", + "smallvec 1.13.2", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" + +[[package]] +name = "cranelift-control" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "cranelift-bitset", + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-frontend" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec 1.13.2", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" + +[[package]] +name = "cranelift-native" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.110.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools", + "log", + "smallvec 1.13.2", + "wasmparser", + "wasmtime-types", +] + [[package]] name = "crc32fast" version = "1.4.0" @@ -1067,6 +1287,15 @@ dependencies = [ "syn 2.0.61", ] +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + [[package]] name = "deranged" version = "0.3.11" @@ -1111,13 +1340,32 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + [[package]] name = "dirs" version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", ] [[package]] @@ -1130,6 +1378,17 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "dirs-sys" version = "0.4.1" @@ -1279,7 +1538,7 @@ dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.8.2", + "toml 0.8.14", "vswhom", "winreg", ] @@ -1290,6 +1549,12 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + [[package]] name = "enclose" version = "1.1.8" @@ -1410,6 +1675,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + [[package]] name = "fastrand" version = "2.1.0" @@ -1420,6 +1691,8 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" name = "fastwave" version = "0.1.0" dependencies = [ + "futures", + "once_cell", "serde", "serde_json", "shared", @@ -1427,9 +1700,22 @@ dependencies = [ "tauri-build", "tauri-plugin-dialog", "tauri-plugin-window-state", + "wasmtime", + "wasmtime-wasi", "wellen", ] +[[package]] +name = "fd-lock" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" +dependencies = [ + "cfg-if", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "fdeflate" version = "0.3.4" @@ -1513,6 +1799,17 @@ dependencies = [ "zoon", ] +[[package]] +name = "fs-set-times" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" +dependencies = [ + "io-lifetimes", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "fst-native" version = "0.8.1" @@ -1544,12 +1841,13 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -1574,9 +1872,9 @@ checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1647,6 +1945,7 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -1686,6 +1985,19 @@ dependencies = [ "byteorder", ] +[[package]] +name = "fxprof-processed-profile" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" +dependencies = [ + "bitflags 2.5.0", + "debugid", + "fxhash", + "serde", + "serde_json", +] + [[package]] name = "gdk" version = "0.18.0" @@ -1849,6 +2161,11 @@ name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +dependencies = [ + "fallible-iterator", + "indexmap 2.2.6", + "stable_deref_trait", +] [[package]] name = "gio" @@ -1912,7 +2229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ "heck 0.4.1", - "proc-macro-crate 2.0.2", + "proc-macro-crate 2.0.0", "proc-macro-error", "proc-macro2", "quote", @@ -2056,11 +2373,24 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "serde", +] [[package]] name = "heck" @@ -2259,6 +2589,12 @@ dependencies = [ "png", ] +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "ident_case" version = "1.0.1" @@ -2321,6 +2657,22 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-extras" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f046b9af244f13b3bd939f55d16830ac3a201e8a9ba9661bfcb03e2be72b9b" +dependencies = [ + "io-lifetimes", + "windows-sys 0.52.0", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" + [[package]] name = "ipnet" version = "2.9.0" @@ -2338,6 +2690,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -2350,6 +2711,26 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "ittapi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1" +dependencies = [ + "anyhow", + "ittapi-sys", + "log", +] + +[[package]] +name = "ittapi-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5385394064fa2c886205dba02598013ce83d3e92d33dbdc0c52fe0e7bf4fc" +dependencies = [ + "cc", +] + [[package]] name = "javascriptcore-rs" version = "1.1.2" @@ -2395,6 +2776,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.69" @@ -2515,6 +2905,12 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "libredox" version = "0.1.3" @@ -2615,6 +3011,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -2653,6 +3058,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "maybe-uninit" version = "2.0.0" @@ -2665,6 +3076,15 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +[[package]] +name = "memfd" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix", +] + [[package]] name = "memmap2" version = "0.9.4" @@ -2952,7 +3372,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ - "proc-macro-crate 2.0.2", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", "syn 2.0.61", @@ -3006,6 +3426,18 @@ dependencies = [ "memchr", ] +[[package]] +name = "object" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +dependencies = [ + "crc32fast", + "hashbrown 0.14.5", + "indexmap 2.2.6", + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -3356,6 +3788,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "postcard" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" +dependencies = [ + "cobs", + "embedded-io", + "serde", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -3386,11 +3829,10 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "toml_datetime", "toml_edit 0.20.2", ] @@ -3433,6 +3875,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + [[package]] name = "qrcode" version = "0.12.0" @@ -3630,6 +4081,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "regalloc2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" +dependencies = [ + "hashbrown 0.13.2", + "log", + "rustc-hash", + "slice-group-by", + "smallvec 1.13.2", +] + [[package]] name = "regex" version = "1.10.4" @@ -3767,12 +4231,25 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efe2374f2385cdd8755a446f80b2a646de603c9d8539ca38734879b5c71e378b" +[[package]] +name = "rust_decoder" +version = "0.1.0" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "rustc-demangle" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.0" @@ -3790,8 +4267,10 @@ checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", + "itoa 1.0.11", "libc", "linux-raw-sys", + "once_cell", "windows-sys 0.52.0", ] @@ -4014,9 +4493,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -4136,6 +4615,15 @@ dependencies = [ "wellen", ] +[[package]] +name = "shellexpand" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +dependencies = [ + "dirs 4.0.0", +] + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -4166,6 +4654,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + [[package]] name = "smallvec" version = "0.6.14" @@ -4180,6 +4674,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -4245,6 +4742,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4378,10 +4881,26 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.2", + "toml 0.8.14", "version-compare", ] +[[package]] +name = "system-interface" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b858526d22750088a9b3cf2e3c2aacebd5377f13adeec02860c30d09113010a6" +dependencies = [ + "bitflags 2.5.0", + "cap-fs-ext", + "cap-std", + "fd-lock", + "io-lifetimes", + "rustix", + "windows-sys 0.52.0", + "winx", +] + [[package]] name = "tao" version = "0.28.0" @@ -4505,7 +5024,7 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml 0.8.2", + "toml 0.8.14", "walkdir", ] @@ -4563,7 +5082,7 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml 0.8.2", + "toml 0.8.14", "walkdir", ] @@ -4690,7 +5209,7 @@ dependencies = [ "serde_with", "swift-rs", "thiserror", - "toml 0.8.2", + "toml 0.8.14", "url", "urlpattern", "walkdir", @@ -4899,21 +5418,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.22.14", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] @@ -4928,7 +5447,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -4936,12 +5455,23 @@ name = "toml_edit" version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.13", ] [[package]] @@ -5054,7 +5584,7 @@ dependencies = [ "cocoa", "core-graphics", "crossbeam-channel", - "dirs", + "dirs 5.0.1", "libappindicator", "muda", "objc", @@ -5175,6 +5705,18 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "untrusted" version = "0.9.0" @@ -5389,6 +5931,15 @@ dependencies = [ "syn 2.0.61", ] +[[package]] +name = "wasm-encoder" +version = "0.211.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e7d931a1120ef357f32b74547646b6fa68ea25e377772b72874b131a9ed70d4" +dependencies = [ + "leb128", +] + [[package]] name = "wasm-streams" version = "0.4.0" @@ -5402,6 +5953,333 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.211.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3189cc8a91f547390e2f043ca3b3e3fe0892f7d581767fd4e4b7f3dc3fe8e561" +dependencies = [ + "ahash", + "bitflags 2.5.0", + "hashbrown 0.14.5", + "indexmap 2.2.6", + "semver", + "serde", +] + +[[package]] +name = "wasmprinter" +version = "0.211.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23708dd7a986bd9b12fca26eff525bbc3659a336e947fd9ed9fdf79086825aec" +dependencies = [ + "anyhow", + "termcolor", + "wasmparser", +] + +[[package]] +name = "wasmtime" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "addr2line", + "anyhow", + "async-trait", + "bitflags 2.5.0", + "bumpalo", + "cc", + "cfg-if", + "encoding_rs", + "fxprof-processed-profile", + "gimli", + "hashbrown 0.14.5", + "indexmap 2.2.6", + "ittapi", + "libc", + "libm", + "log", + "mach2", + "memfd", + "object 0.36.1", + "once_cell", + "paste", + "postcard", + "psm", + "rayon", + "rustix", + "semver", + "serde", + "serde_derive", + "serde_json", + "smallvec 1.13.2", + "sptr", + "target-lexicon", + "wasm-encoder", + "wasmparser", + "wasmtime-asm-macros", + "wasmtime-cache", + "wasmtime-component-macro", + "wasmtime-component-util", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-fiber", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", + "wasmtime-slab", + "wasmtime-versioned-export-macros", + "wasmtime-winch", + "wat", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-cache" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "base64 0.21.7", + "directories-next", + "log", + "postcard", + "rustix", + "serde", + "serde_derive", + "sha2", + "toml 0.8.14", + "windows-sys 0.52.0", + "zstd", +] + +[[package]] +name = "wasmtime-component-macro" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.61", + "wasmtime-component-util", + "wasmtime-wit-bindgen", + "wit-parser", +] + +[[package]] +name = "wasmtime-component-util" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" + +[[package]] +name = "wasmtime-cranelift" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "cfg-if", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli", + "log", + "object 0.36.1", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-environ", + "wasmtime-versioned-export-macros", +] + +[[package]] +name = "wasmtime-environ" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "cpp_demangle", + "cranelift-bitset", + "cranelift-entity", + "gimli", + "indexmap 2.2.6", + "log", + "object 0.36.1", + "postcard", + "rustc-demangle", + "semver", + "serde", + "serde_derive", + "target-lexicon", + "wasm-encoder", + "wasmparser", + "wasmprinter", + "wasmtime-component-util", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-fiber" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "rustix", + "wasmtime-asm-macros", + "wasmtime-versioned-export-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "object 0.36.1", + "once_cell", + "rustix", + "wasmtime-versioned-export-macros", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "cfg-if", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-slab" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" + +[[package]] +name = "wasmtime-types" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "cranelift-entity", + "serde", + "serde_derive", + "smallvec 1.13.2", + "wasmparser", +] + +[[package]] +name = "wasmtime-versioned-export-macros" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "wasmtime-wasi" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.5.0", + "bytes", + "cap-fs-ext", + "cap-net-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "futures", + "io-extras", + "io-lifetimes", + "once_cell", + "rustix", + "system-interface", + "thiserror", + "tokio", + "tracing", + "url", + "wasmtime", + "wiggle", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-winch" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "object 0.36.1", + "target-lexicon", + "wasmparser", + "wasmtime-cranelift", + "wasmtime-environ", + "winch-codegen", +] + +[[package]] +name = "wasmtime-wit-bindgen" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "heck 0.4.1", + "indexmap 2.2.6", + "wit-parser", +] + +[[package]] +name = "wast" +version = "35.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +dependencies = [ + "leb128", +] + +[[package]] +name = "wast" +version = "211.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b25506dd82d00da6b14a87436b3d52b1d264083fa79cdb72a0d1b04a8595ccaa" +dependencies = [ + "bumpalo", + "leb128", + "memchr", + "unicode-width", + "wasm-encoder", +] + +[[package]] +name = "wat" +version = "1.211.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb716ca6c86eecac2d82541ffc39860118fc0af9309c4f2670637bea2e1bdd7d" +dependencies = [ + "wast 211.0.1", +] + [[package]] name = "wayland-sys" version = "0.31.1" @@ -5525,6 +6403,45 @@ dependencies = [ "thiserror", ] +[[package]] +name = "wiggle" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.5.0", + "thiserror", + "tracing", + "wasmtime", + "wiggle-macro", +] + +[[package]] +name = "wiggle-generate" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro2", + "quote", + "shellexpand", + "syn 2.0.61", + "witx", +] + +[[package]] +name = "wiggle-macro" +version = "23.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", + "wiggle-generate", +] + [[package]] name = "winapi" version = "0.3.9" @@ -5556,6 +6473,22 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winch-codegen" +version = "0.21.0" +source = "git+https://github.com/bytecodealliance/wasmtime?rev=842fa767acdc26f096ac108605353b8b71e23169#842fa767acdc26f096ac108605353b8b71e23169" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "regalloc2", + "smallvec 1.13.2", + "target-lexicon", + "wasmparser", + "wasmtime-cranelift", + "wasmtime-environ", +] + [[package]] name = "window-vibrancy" version = "0.5.0" @@ -5863,6 +6796,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.52.0" @@ -5873,6 +6815,55 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winx" +version = "0.36.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" +dependencies = [ + "bitflags 2.5.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c7526379ace8709ee9ab9f2bb50f112d95581063a59ef3097d9c10153886c9" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "wit-parser" +version = "0.211.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cc90c50c7ec8a824b5d2cddddff13b2dc12b7a96bf8684d11474223c2ea22f" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.2.6", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "witx" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +dependencies = [ + "anyhow", + "log", + "thiserror", + "wast 35.0.2", +] + [[package]] name = "wry" version = "0.40.1" @@ -6065,6 +7056,34 @@ dependencies = [ "web-sys", ] +[[package]] +name = "zstd" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.11+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "zvariant" version = "4.0.0" diff --git a/Cargo.toml b/Cargo.toml index 5ab2fb1..18893b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = [ "frontend", "backend", "shared", - "src-tauri", + "src-tauri", "test_files/components/rust_decoder", ] resolver = "2" diff --git a/README.md b/README.md index 496712d..c798955 100644 --- a/README.md +++ b/README.md @@ -3,34 +3,44 @@ --- +

Browser (Firefox)

Fastwave - Browser (Firefox) - Browser (Firefox)

+

Desktop, miller columns and tree

Fastwave - Desktop, miller columns and tree - Desktop, miller columns and tree

+

Zoom, pan and basic number formats

Fastwave - Zoom, pan and basic number formats - Zoom, pan and basic number formats

+

Zoom and all formats

Fastwave - Zoom and all formats - Zoom and all formats

+

Javascript commands

Fastwave - Javascript commands - Javascript commands

+

Load and save selected variables

Fastwave - Load and save selected variables - Load and save selected variables +

+ +

Decoders Demo

+

+ Fastwave - Decoders demo +

+ +

Decoder Interface

+

+ Fastwave - Decoder Interface

--- diff --git a/docs/screenshot_world_wit.png b/docs/screenshot_world_wit.png new file mode 100644 index 0000000..df6a93e Binary files /dev/null and b/docs/screenshot_world_wit.png differ diff --git a/docs/video_decoders.gif b/docs/video_decoders.gif new file mode 100644 index 0000000..e9c34ed Binary files /dev/null and b/docs/video_decoders.gif differ diff --git a/frontend/src/header_panel.rs b/frontend/src/header_panel.rs index 72e5c25..3becd90 100644 --- a/frontend/src/header_panel.rs +++ b/frontend/src/header_panel.rs @@ -241,8 +241,10 @@ impl HeaderPanel { if raw_event.shift_key() { // @TODO move `prevent_default` to MZ API (next to the `pass_to_parent` method?) raw_event.prevent_default(); - let result = script_bridge::strict_eval(&script.lock_ref()); - command_result.set(Some(result)); + Task::start(clone!((script, command_result) async move { + let result = script_bridge::strict_eval(&script.lock_ref()).await; + command_result.set(Some(result)); + })); } } }) diff --git a/frontend/src/main.rs b/frontend/src/main.rs index 0db9ce7..8c45559 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -8,7 +8,7 @@ mod controls_panel; use controls_panel::ControlsPanel; mod waveform_panel; -use waveform_panel::WaveformPanel; +use waveform_panel::{PixiController, WaveformPanel}; mod header_panel; use header_panel::HeaderPanel; @@ -27,6 +27,7 @@ struct Store { selected_var_refs: MutableVec, hierarchy: Mutable>>, loaded_filename: Mutable>, + canvas_controller: Mutable>>>, } static STORE: Lazy = lazy::default(); @@ -45,6 +46,7 @@ fn root() -> impl Element { let selected_var_refs = STORE.selected_var_refs.clone(); let layout: Mutable = <_>::default(); let loaded_filename = STORE.loaded_filename.clone(); + let canvas_controller = STORE.canvas_controller.clone(); Column::new() .s(Height::fill()) .s(Scrollbars::y_and_clip_x()) @@ -69,13 +71,15 @@ fn root() -> impl Element { let hierarchy = hierarchy.clone(); let selected_var_refs = selected_var_refs.clone(); let loaded_filename = loaded_filename.clone(); + let canvas_controller = canvas_controller.clone(); map_ref!{ let layout = layout.signal(), let hierarchy_is_some = hierarchy.signal_ref(Option::is_some) => { - (*hierarchy_is_some && matches!(layout, Layout::Tree)).then(clone!((hierarchy, selected_var_refs, loaded_filename) move || WaveformPanel::new( + (*hierarchy_is_some && matches!(layout, Layout::Tree)).then(clone!((hierarchy, selected_var_refs, loaded_filename, canvas_controller) move || WaveformPanel::new( hierarchy.clone(), selected_var_refs.clone(), loaded_filename.clone(), + canvas_controller.clone(), ))) } } @@ -85,10 +89,11 @@ fn root() -> impl Element { map_ref!{ let layout = layout.signal(), let hierarchy_is_some = hierarchy.signal_ref(Option::is_some) => { - (*hierarchy_is_some && matches!(layout, Layout::Columns)).then(clone!((hierarchy, selected_var_refs, loaded_filename) move || WaveformPanel::new( + (*hierarchy_is_some && matches!(layout, Layout::Columns)).then(clone!((hierarchy, selected_var_refs, loaded_filename, canvas_controller) move || WaveformPanel::new( hierarchy.clone(), selected_var_refs.clone(), loaded_filename.clone(), + canvas_controller.clone(), ))) } } diff --git a/frontend/src/platform.rs b/frontend/src/platform.rs index e152433..20a7707 100644 --- a/frontend/src/platform.rs +++ b/frontend/src/platform.rs @@ -3,6 +3,8 @@ // NOTE: `FASTWAVE_PLATFORM` is set in `Makefile.toml` tasks and then in `build.rs` +use crate::STORE; + #[cfg(FASTWAVE_PLATFORM = "TAURI")] mod tauri; #[cfg(FASTWAVE_PLATFORM = "TAURI")] @@ -15,6 +17,9 @@ use browser as platform; type Filename = String; type JavascriptCode = String; +type AddedDecodersCount = usize; +type RemovedDecodersCount = usize; +type DecoderPath = String; pub async fn show_window() { platform::show_window().await @@ -58,3 +63,25 @@ pub async fn load_signal_and_get_timeline( pub async fn unload_signal(signal_ref: wellen::SignalRef) { platform::unload_signal(signal_ref).await } + +pub async fn add_decoders(decoder_paths: Vec) -> AddedDecodersCount { + let count = platform::add_decoders(decoder_paths).await; + if count > 0 { + redraw_all_timeline_rows().await; + } + count +} + +pub async fn remove_all_decoders() -> RemovedDecodersCount { + let count = platform::remove_all_decoders().await; + if count > 0 { + redraw_all_timeline_rows().await; + } + count +} + +async fn redraw_all_timeline_rows() { + if let Some(controller) = STORE.canvas_controller.get_cloned().get_cloned() { + controller.redraw_all_rows().await + } +} diff --git a/frontend/src/platform/browser.rs b/frontend/src/platform/browser.rs index 363a5c2..56fc6d2 100644 --- a/frontend/src/platform/browser.rs +++ b/frontend/src/platform/browser.rs @@ -1,7 +1,7 @@ use shared::wellen_helpers; use std::sync::Mutex; use wellen::simple::Waveform; -use zoon::*; +use zoon::{eprintln, *}; #[derive(Default)] struct BrowserPlatformStore { @@ -111,7 +111,9 @@ pub(super) async fn load_signal_and_get_timeline( timeline_viewport_x, block_height, var_format, - ); + |value| Box::pin(async { value }), + ) + .await; timeline } @@ -120,3 +122,17 @@ pub(super) async fn unload_signal(signal_ref: wellen::SignalRef) { let waveform = waveform_lock.as_mut().unwrap_throw(); waveform.unload_signals(&[signal_ref]); } + +pub(super) async fn add_decoders( + _decoder_paths: Vec, +) -> super::AddedDecodersCount { + // @TODO error message for user + eprintln!("Adding decoders is not supported in the browser."); + 0 +} + +pub(super) async fn remove_all_decoders() -> super::RemovedDecodersCount { + // @TODO error message for user + eprintln!("Removing decoders is not supported in the browser."); + 0 +} diff --git a/frontend/src/platform/tauri.rs b/frontend/src/platform/tauri.rs index aea34b6..b55ffef 100644 --- a/frontend/src/platform/tauri.rs +++ b/frontend/src/platform/tauri.rs @@ -56,6 +56,18 @@ pub(super) async fn unload_signal(signal_ref: wellen::SignalRef) { .unwrap_throw() } +pub(super) async fn add_decoders( + decoder_paths: Vec, +) -> super::AddedDecodersCount { + serde_wasm_bindgen::from_value(tauri_glue::add_decoders(decoder_paths).await.unwrap_throw()) + .unwrap_throw() +} + +pub(super) async fn remove_all_decoders() -> super::RemovedDecodersCount { + serde_wasm_bindgen::from_value(tauri_glue::remove_all_decoders().await.unwrap_throw()) + .unwrap_throw() +} + mod tauri_glue { use zoon::*; @@ -86,5 +98,13 @@ mod tauri_glue { #[wasm_bindgen(catch)] pub async fn unload_signal(signal_ref_index: usize) -> Result<(), JsValue>; + + #[wasm_bindgen(catch)] + pub async fn add_decoders( + decoder_paths: Vec, + ) -> Result; + + #[wasm_bindgen(catch)] + pub async fn remove_all_decoders() -> Result; } } diff --git a/frontend/src/script_bridge.rs b/frontend/src/script_bridge.rs index 0dcf94a..183fad1 100644 --- a/frontend/src/script_bridge.rs +++ b/frontend/src/script_bridge.rs @@ -1,15 +1,16 @@ -use crate::STORE; +use crate::{platform, STORE}; use wellen::GetItem; use zoon::*; type FullVarName = String; +type AddedDecodersCount = usize; +type RemovedDecodersCount = usize; +type DecoderPath = String; -#[wasm_bindgen( - inline_js = r#"export function strict_eval(code) { "use strict"; return eval?.(`${code}`) }"# -)] +#[wasm_bindgen(module = "/typescript/bundles/strict_eval.js")] extern "C" { #[wasm_bindgen(catch)] - pub fn strict_eval(code: &str) -> Result; + pub async fn strict_eval(code: &str) -> Result; } #[wasm_bindgen] @@ -67,4 +68,14 @@ impl FW { } Vec::new() } + + /// JS: `FW.add_decoders(["../test_files/components/rust_decoder/rust_decoder.wasm"])` -> `1` + pub async fn add_decoders(decoder_paths: Vec) -> AddedDecodersCount { + platform::add_decoders(decoder_paths).await + } + + /// JS: `FW.remove_all_decoders()` -> `5` + pub async fn remove_all_decoders() -> RemovedDecodersCount { + platform::remove_all_decoders().await + } } diff --git a/frontend/src/waveform_panel.rs b/frontend/src/waveform_panel.rs index f9f42e6..e2ce51f 100644 --- a/frontend/src/waveform_panel.rs +++ b/frontend/src/waveform_panel.rs @@ -4,7 +4,8 @@ use wellen::GetItem; use zoon::*; mod pixi_canvas; -use pixi_canvas::{PixiCanvas, PixiController}; +use pixi_canvas::PixiCanvas; +pub use pixi_canvas::PixiController; const ROW_HEIGHT: u32 = 40; const ROW_GAP: u32 = 4; @@ -14,7 +15,7 @@ pub struct WaveformPanel { selected_var_refs: MutableVec, hierarchy: Mutable>>, loaded_filename: Mutable>, - canvas_controller: Mutable>>, + canvas_controller: Mutable>>>, } impl WaveformPanel { @@ -22,12 +23,13 @@ impl WaveformPanel { hierarchy: Mutable>>, selected_var_refs: MutableVec, loaded_filename: Mutable>, + canvas_controller: Mutable>>>, ) -> impl Element { Self { selected_var_refs, hierarchy, loaded_filename, - canvas_controller: Mutable::new(Mutable::default().read_only()), + canvas_controller, } .root() } @@ -96,7 +98,7 @@ impl WaveformPanel { if let Some(javascript_code) = platform::load_file_with_selected_vars(None).await { - match script_bridge::strict_eval(&javascript_code) { + match script_bridge::strict_eval(&javascript_code).await { Ok(js_value) => { zoon::println!("File with selected vars loaded: {js_value:?}") } @@ -153,7 +155,7 @@ impl WaveformPanel { if let Some(javascript_code) = platform::load_file_with_selected_vars(Some(file)).await { - match script_bridge::strict_eval(&javascript_code) { + match script_bridge::strict_eval(&javascript_code).await { Ok(js_value) => zoon::println!( "File with selected vars loaded: {js_value:?}" ), diff --git a/frontend/src/waveform_panel/pixi_canvas.rs b/frontend/src/waveform_panel/pixi_canvas.rs index ffc8806..cb74f6f 100644 --- a/frontend/src/waveform_panel/pixi_canvas.rs +++ b/frontend/src/waveform_panel/pixi_canvas.rs @@ -5,7 +5,7 @@ use zoon::*; pub struct PixiCanvas { raw_el: RawHtmlEl, - controller: ReadOnlyMutable>, + controller: Mutable>>, #[allow(dead_code)] width: ReadOnlyMutable, #[allow(dead_code)] @@ -32,7 +32,8 @@ impl HasIds for PixiCanvas {} impl PixiCanvas { pub fn new(row_height: u32, row_gap: u32) -> Self { - let controller: Mutable> = Mutable::new(None); + let controller: Mutable>> = + Mutable::new(None); let width = Mutable::new(0); let height = Mutable::new(0); let resize_task = Task::start_droppable( @@ -77,7 +78,7 @@ impl PixiCanvas { )); // -- // -- Self { - controller: controller.read_only(), + controller: controller.clone(), width: width.read_only(), height: height.read_only(), task_with_controller: task_with_controller.clone(), @@ -105,14 +106,14 @@ impl PixiCanvas { }) .after_insert(clone!((controller, timeline_getter) move |element| { Task::start(async move { - let pixi_controller = js_bridge::PixiController::new( + let pixi_controller = SendWrapper::new(js_bridge::PixiController::new( 1., width.get(), 0, row_height, row_gap, &timeline_getter - ); + )); pixi_controller.init(&element).await; controller.set(Some(pixi_controller)); }); @@ -131,7 +132,7 @@ impl PixiCanvas { pub fn task_with_controller + 'static>( self, - f: impl FnOnce(ReadOnlyMutable>) -> FUT, + f: impl FnOnce(Mutable>>) -> FUT, ) -> Self { self.task_with_controller .set(Some(Task::start_droppable(f(self.controller.clone())))); @@ -186,6 +187,8 @@ mod js_bridge { #[wasm_bindgen(method)] pub fn destroy(this: &PixiController); + // -- FastWave-specific -- + #[wasm_bindgen(method)] pub fn get_timeline_zoom(this: &PixiController) -> f64; @@ -195,8 +198,6 @@ mod js_bridge { #[wasm_bindgen(method)] pub fn get_timeline_viewport_x(this: &PixiController) -> i32; - // -- FastWave-specific -- - #[wasm_bindgen(method)] pub fn set_var_format(this: &PixiController, index: usize, var_format: JsValue); @@ -224,5 +225,8 @@ mod js_bridge { #[wasm_bindgen(method)] pub fn clear_vars(this: &PixiController); + + #[wasm_bindgen(method)] + pub async fn redraw_all_rows(this: &PixiController); } } diff --git a/frontend/typescript/bundles/pixi_canvas.js b/frontend/typescript/bundles/pixi_canvas.js index 674bb70..607cf53 100644 --- a/frontend/typescript/bundles/pixi_canvas.js +++ b/frontend/typescript/bundles/pixi_canvas.js @@ -35265,6 +35265,8 @@ var PixiController = class { clear_vars() { this.var_signal_rows.slice().reverse().forEach((row) => row.destroy()); } + request_timeline_redraw() { + } }; var VarSignalRow = class { signal_ref_index; diff --git a/frontend/typescript/bundles/strict_eval.js b/frontend/typescript/bundles/strict_eval.js new file mode 100644 index 0000000..ffcdd89 --- /dev/null +++ b/frontend/typescript/bundles/strict_eval.js @@ -0,0 +1,5 @@ +"use strict"; + +export async function strict_eval(code) { + return await eval(code) +} diff --git a/frontend/typescript/bundles/tauri_glue.js b/frontend/typescript/bundles/tauri_glue.js index 026793f..9fae877 100644 --- a/frontend/typescript/bundles/tauri_glue.js +++ b/frontend/typescript/bundles/tauri_glue.js @@ -2536,11 +2536,19 @@ async function load_signal_and_get_timeline(signal_ref_index, timeline_zoom, tim async function unload_signal(signal_ref_index) { return await invoke2("unload_signal", { signal_ref_index }); } +async function add_decoders(decoder_paths) { + return await invoke2("add_decoders", { decoder_paths }); +} +async function remove_all_decoders() { + return await invoke2("remove_all_decoders"); +} export { + add_decoders, get_hierarchy, load_file_with_selected_vars, load_signal_and_get_timeline, pick_and_load_waveform, + remove_all_decoders, show_window, unload_signal }; diff --git a/frontend/typescript/pixi_canvas/pixi_canvas.ts b/frontend/typescript/pixi_canvas/pixi_canvas.ts index 39b896d..ea1ea42 100644 --- a/frontend/typescript/pixi_canvas/pixi_canvas.ts +++ b/frontend/typescript/pixi_canvas/pixi_canvas.ts @@ -199,6 +199,10 @@ export class PixiController { clear_vars() { this.var_signal_rows.slice().reverse().forEach(row => row.destroy()); } + + request_timeline_redraw() { + + } } class VarSignalRow { diff --git a/frontend/typescript/tauri_glue/tauri_glue.ts b/frontend/typescript/tauri_glue/tauri_glue.ts index a4be66c..8db7f81 100644 --- a/frontend/typescript/tauri_glue/tauri_glue.ts +++ b/frontend/typescript/tauri_glue/tauri_glue.ts @@ -9,6 +9,9 @@ type JavascriptCode = string; type WellenHierarchy = unknown; type Timeline = unknown; type VarFormat = unknown; +type AddedDecodersCount = number; +type RemovedDecodersCount = number; +type DecoderPath = string; export async function show_window(): Promise { return await invoke("show_window"); @@ -47,3 +50,11 @@ export async function load_signal_and_get_timeline( export async function unload_signal(signal_ref_index: number): Promise { return await invoke("unload_signal", { signal_ref_index }); } + +export async function add_decoders(decoder_paths: Array): Promise { + return await invoke("add_decoders", { decoder_paths }); +} + +export async function remove_all_decoders(): Promise { + return await invoke("remove_all_decoders"); +} diff --git a/shared/src/signal_to_timeline.rs b/shared/src/signal_to_timeline.rs index f2d05b6..9aa1696 100644 --- a/shared/src/signal_to_timeline.rs +++ b/shared/src/signal_to_timeline.rs @@ -1,13 +1,25 @@ use crate::*; +use future::BoxFuture; +use wellen::SignalValue; -pub fn signal_to_timeline( - signal: &wellen::Signal, +// @TODO remove once https://github.com/rust-lang/rust/issues/89976 is resolved +// (`error: implementation of `FnOnce` is not general enough`) +fn type_hint(f: F) -> F +where + F: for<'a> FnMut((u32, SignalValue<'a>)) -> (f64, SignalValue<'a>), +{ + f +} + +pub async fn signal_to_timeline<'s>( + signal: &'s wellen::Signal, time_table: &[wellen::Time], timeline_zoom: f64, timeline_viewport_width: u32, timeline_viewport_x: i32, block_height: u32, var_format: VarFormat, + mut format_by_decoders: impl FnMut(String) -> BoxFuture<'s, String>, ) -> Timeline { const MIN_BLOCK_WIDTH: u32 = 3; // Courier New, 16px, sync with `label_style` in `pixi_canvas.rs` @@ -25,12 +37,12 @@ pub fn signal_to_timeline( let mut x_value_pairs = signal .iter_changes() - .map(|(index, value)| { + .map(type_hint(move |(index, value)| { let index = index as usize; let time = time_table[index] as f64; let x = time / last_time * timeline_width - timeline_viewport_x; (x, value) - }) + })) .peekable(); // @TODO parallelize? @@ -55,7 +67,8 @@ pub fn signal_to_timeline( } // @TODO cache? - let value = var_format.format(value); + let mut value = var_format.format(value); + value = format_by_decoders(value).await; let value_width = (value.chars().count() as f64 * LETTER_WIDTH) as u32; // @TODO Ellipsis instead of hiding? diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 490242c..8884690 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -23,3 +23,11 @@ serde = { version = "1.0", features = ["derive"] } tauri = { version = "=2.0.0-beta.22", features = ["macos-private-api", "linux-ipc-protocol"] } tauri-plugin-window-state = "=2.0.0-beta.9" tauri-plugin-dialog = "=2.0.0-beta.9" +once_cell = "1.19.0" +futures = "0.3.30" + +# wasmtime = "22.0.0" +# wasmtime-wasi = "22.0.0" +# ~23.0.0 +wasmtime = { git = "https://github.com/bytecodealliance/wasmtime", rev = "842fa767acdc26f096ac108605353b8b71e23169" } +wasmtime-wasi = { git = "https://github.com/bytecodealliance/wasmtime", rev = "842fa767acdc26f096ac108605353b8b71e23169" } diff --git a/src-tauri/src/component_manager.rs b/src-tauri/src/component_manager.rs new file mode 100644 index 0000000..58bce57 --- /dev/null +++ b/src-tauri/src/component_manager.rs @@ -0,0 +1,125 @@ +use crate::{AddedDecodersCount, DecoderPath, RemovedDecodersCount}; +use once_cell::sync::Lazy; +use std::sync::Arc; +use tauri::async_runtime::{Mutex, RwLock}; +use wasmtime::component::{Component as WasmtimeComponent, *}; +use wasmtime::{AsContextMut, Engine, Store}; +use wasmtime_wasi::{WasiCtx, WasiView}; + +bindgen!(); + +pub static DECODERS: Lazy>>> = Lazy::new(<_>::default); +static ENGINE: Lazy = Lazy::new(<_>::default); +static LINKER: Lazy> = Lazy::new(|| { + let mut linker = Linker::new(&ENGINE); + wasmtime_wasi::add_to_linker_sync(&mut linker).unwrap(); + Component::add_to_linker(&mut linker, |state: &mut State| state).unwrap(); + linker +}); +pub static STORE: Lazy>>> = Lazy::new(|| { + let store = Store::new( + &ENGINE, + State { + ctx: WasiCtx::builder().build(), + table: ResourceTable::new(), + }, + ); + Arc::new(Mutex::new(store)) +}); + +pub struct State { + ctx: WasiCtx, + table: ResourceTable, +} + +impl WasiView for State { + fn ctx(&mut self) -> &mut WasiCtx { + &mut self.ctx + } + fn table(&mut self) -> &mut ResourceTable { + &mut self.table + } +} + +impl component::decoder::host::Host for State { + fn log(&mut self, message: String) { + println!("Decoder: {message}"); + } +} + +pub async fn remove_all_decoders() -> RemovedDecodersCount { + let mut decoders = DECODERS.write().await; + let decoders_count = decoders.len(); + decoders.clear(); + decoders_count +} + +// @TODO Make println work on Windows in release mode? +// https://github.com/tauri-apps/tauri/discussions/8626 + +// @TODO Remove / improve comments below +// Testing +// +// Rust +// FW.add_decoders(["../test_files/components/rust_decoder/rust_decoder.wasm"]) +// FW.add_decoders(["../test_files/components/rust_decoder/rust_decoder.wasm", "../test_files/components/rust_decoder/rust_decoder.wasm"]) +// +// JS +// FW.add_decoders(["../test_files/components/javascript_decoder/javascript_decoder.wasm"]) +// +// Python +// FW.add_decoders(["../test_files/components/python_decoder/python_decoder.wasm"]) +// +// Remove all +// FW.remove_all_decoders() +// +// All Debug +// FW.add_decoders(["../test_files/components/rust_decoder/rust_decoder.wasm", "../test_files/components/javascript_decoder/javascript_decoder.wasm", "../test_files/components/python_decoder/python_decoder.wasm"]) +// +// All Release +// FW.add_decoders(["../../test_files/components/rust_decoder/rust_decoder.wasm", "../../test_files/components/javascript_decoder/javascript_decoder.wasm", "../../test_files/components/python_decoder/python_decoder.wasm"]) +pub async fn add_decoders(decoder_paths: Vec) -> AddedDecodersCount { + println!("Decoders: {decoder_paths:#?}"); + println!("Current dir: {:#?}", std::env::current_dir().unwrap()); + + let mut added_decoders_count = 0; + + // @TODO (?) New thread to prevent "Cannot start a runtime from within a runtime." + // when a call to a component fails / panics + // std::thread::spawn(move || { + // futures::executor::block_on(async move { + for decoder_path in decoder_paths { + if let Err(error) = add_decoder(&decoder_path).await { + eprintln!("add_decoders error: {error:?}"); + } else { + added_decoders_count += 1; + } + } + // }) + // }).join().unwrap(); + + added_decoders_count +} + +async fn add_decoder(path: &str) -> wasmtime::Result<()> { + let wasmtime_component = WasmtimeComponent::from_file(&ENGINE, path)?; + + let mut store_lock = STORE.lock().await; + let mut store = store_lock.as_context_mut(); + + let component = Component::instantiate(&mut store, &wasmtime_component, &LINKER)?; + + println!( + "Decoder name: {}", + component + .component_decoder_decoder() + .call_name(&mut store)? + ); + component + .component_decoder_decoder() + .call_init(&mut store)?; + + DECODERS.write().await.push(component); + + Ok(()) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index c8752db..fafbf88 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,14 +1,20 @@ use std::fs; -use std::sync::Mutex; +use tauri::async_runtime::RwLock; use tauri_plugin_dialog::DialogExt; +use wasmtime::AsContextMut; use wellen::simple::Waveform; type Filename = String; type JavascriptCode = String; +type AddedDecodersCount = usize; +type RemovedDecodersCount = usize; +type DecoderPath = String; + +mod component_manager; #[derive(Default)] struct Store { - waveform: Mutex>, + waveform: RwLock>, } #[tauri::command(rename_all = "snake_case")] @@ -30,7 +36,7 @@ async fn pick_and_load_waveform( let Ok(waveform) = waveform else { panic!("Waveform file reading failed") }; - *store.waveform.lock().unwrap() = Some(waveform); + *store.waveform.write().await = Some(waveform); Ok(Some(file_response.name.unwrap())) } @@ -48,8 +54,9 @@ async fn load_file_with_selected_vars(app: tauri::AppHandle) -> Result) -> Result { - let waveform = store.waveform.lock().unwrap(); - let hierarchy = waveform.as_ref().unwrap().hierarchy(); + let waveform_lock = store.waveform.read().await; + let waveform = waveform_lock.as_ref().unwrap(); + let hierarchy = waveform.hierarchy(); Ok(serde_json::to_value(hierarchy).unwrap()) } @@ -65,7 +72,7 @@ async fn load_signal_and_get_timeline( ) -> Result { // @TODO run (all?) in a blocking thread? let signal_ref = wellen::SignalRef::from_index(signal_ref_index).unwrap(); - let mut waveform_lock = store.waveform.lock().unwrap(); + let mut waveform_lock = store.waveform.write().await; let waveform = waveform_lock.as_mut().unwrap(); waveform.load_signals_multi_threaded(&[signal_ref]); let signal = waveform.get_signal(signal_ref).unwrap(); @@ -78,19 +85,56 @@ async fn load_signal_and_get_timeline( timeline_viewport_x, block_height, var_format, - ); + |mut value: String| { + Box::pin(async { + // We need to spawn a (non-runtime-specific?) blocking task before calling component methods to prevent this error: + // "Cannot start a runtime from within a runtime. This happens because a function (like `block_on`) attempted to block the current thread while the thread is being used to drive asynchronous tasks." + // @TODO Workaround? Is it a problem only for non-Rust components? Is it needed only when there is a problem in the component (e.g. "`Err` value: wasm trap: cannot enter component instance"?) + // let value = std::thread::spawn(move || { + // futures::executor::block_on(async move { + let decoders = component_manager::DECODERS.read().await; + let mut store_lock = component_manager::STORE.lock().await; + let mut store = store_lock.as_context_mut(); + + for decoder in decoders.iter() { + value = decoder + .component_decoder_decoder() + .call_format_signal_value(&mut store, &value) + // @TODO Resolve panic when running non-Rust components: + // `Err` value: wasm trap: cannot enter component instance + // https://github.com/bytecodealliance/wasmtime/issues/8670 ? + .unwrap() + } + // value + // }) + // }).join().unwrap(); + value + }) + }, + ) + .await; Ok(serde_json::to_value(timeline).unwrap()) } #[tauri::command(rename_all = "snake_case")] async fn unload_signal(signal_ref_index: usize, store: tauri::State<'_, Store>) -> Result<(), ()> { let signal_ref = wellen::SignalRef::from_index(signal_ref_index).unwrap(); - let mut waveform_lock = store.waveform.lock().unwrap(); + let mut waveform_lock = store.waveform.write().await; let waveform = waveform_lock.as_mut().unwrap(); waveform.unload_signals(&[signal_ref]); Ok(()) } +#[tauri::command(rename_all = "snake_case")] +async fn add_decoders(decoder_paths: Vec) -> Result { + Ok(component_manager::add_decoders(decoder_paths).await) +} + +#[tauri::command(rename_all = "snake_case")] +async fn remove_all_decoders() -> Result { + Ok(component_manager::remove_all_decoders().await) +} + #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { // https://github.com/tauri-apps/tauri/issues/8462 @@ -109,6 +153,8 @@ pub fn run() { get_hierarchy, load_signal_and_get_timeline, unload_signal, + add_decoders, + remove_all_decoders, ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src-tauri/wit/world.wit b/src-tauri/wit/world.wit new file mode 100644 index 0000000..9205cff --- /dev/null +++ b/src-tauri/wit/world.wit @@ -0,0 +1,16 @@ +package component:decoder; + +interface host { + log: func(message: string); +} + +interface decoder { + init: func(); + name: func() -> string; + format-signal-value: func(value: string) -> string; +} + +world component { + import host; + export decoder; +} diff --git a/test_files/components/README.md b/test_files/components/README.md new file mode 100644 index 0000000..21f5975 --- /dev/null +++ b/test_files/components/README.md @@ -0,0 +1 @@ +https://component-model.bytecodealliance.org/ diff --git a/test_files/components/javascript_decoder/.gitignore b/test_files/components/javascript_decoder/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/test_files/components/javascript_decoder/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/test_files/components/javascript_decoder/README.md b/test_files/components/javascript_decoder/README.md new file mode 100644 index 0000000..4cf628c --- /dev/null +++ b/test_files/components/javascript_decoder/README.md @@ -0,0 +1,10 @@ +How to create and build the Javascript component: + +1. Create the `javascript_decoder` folder +2. `cd javascript_decoder` +3. Create `.gitignore` with content `node_modules` +4. `npm install @bytecodealliance/jco @bytecodealliance/componentize-js binaryen` +5. Create the `src` folder with the file `index.js` +6. Create the `wit` folder with the file `world.wit` +7. Update code as needed +8. `npx jco componentize src/index.js --wit wit/world.wit --out javascript_decoder.wasm && npx jco opt javascript_decoder.wasm --output javascript_decoder.wasm` diff --git a/test_files/components/javascript_decoder/javascript_decoder.wasm b/test_files/components/javascript_decoder/javascript_decoder.wasm new file mode 100644 index 0000000..de92508 Binary files /dev/null and b/test_files/components/javascript_decoder/javascript_decoder.wasm differ diff --git a/test_files/components/javascript_decoder/package-lock.json b/test_files/components/javascript_decoder/package-lock.json new file mode 100644 index 0000000..498a8bf --- /dev/null +++ b/test_files/components/javascript_decoder/package-lock.json @@ -0,0 +1,570 @@ +{ + "name": "javascript_decoder", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@bytecodealliance/componentize-js": "^0.8.3", + "@bytecodealliance/jco": "^1.2.4", + "binaryen": "^117.0.0" + } + }, + "node_modules/@bytecodealliance/componentize-js": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@bytecodealliance/componentize-js/-/componentize-js-0.8.3.tgz", + "integrity": "sha512-QyEHRtVg/Cg6RsA75AvRSbSOr0u+FLuXqB89X4Sys44K/VT5g/S9eMn8gqTotfuXVU3btS3Z4QAiyHSF2bja3w==", + "dependencies": { + "@bytecodealliance/jco": "1.1.1", + "@bytecodealliance/wizer": "^3.0.1", + "es-module-lexer": "^1.4.1" + } + }, + "node_modules/@bytecodealliance/componentize-js/node_modules/@bytecodealliance/jco": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco/-/jco-1.1.1.tgz", + "integrity": "sha512-s8Zz6GFPlo2g+dsGp1OMIWXSZnM4FyIloxNAc4grF5TZwFoD00Gj8b0xvpmFSeZj36X/bJPa7x3za3j7Cfeetw==", + "dependencies": { + "@bytecodealliance/preview2-shim": "^0.16.1", + "binaryen": "^116.0.0", + "chalk-template": "^1", + "commander": "^12", + "mkdirp": "^3", + "ora": "^8", + "terser": "^5" + }, + "bin": { + "jco": "src/jco.js" + } + }, + "node_modules/@bytecodealliance/componentize-js/node_modules/binaryen": { + "version": "116.0.0", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-116.0.0.tgz", + "integrity": "sha512-Hp0dXC6Cb/rTwWEoUS2BRghObE7g/S9umKtxuTDt3f61G6fNTE/YVew/ezyy3IdHcLx3f17qfh6LwETgCfvWkQ==", + "bin": { + "wasm-opt": "bin/wasm-opt", + "wasm2js": "bin/wasm2js" + } + }, + "node_modules/@bytecodealliance/jco": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco/-/jco-1.2.4.tgz", + "integrity": "sha512-uuOm9UkYqWp5uElYDNzlhjbdrAmczEvETgQdI1hFTk79h+mrmHPRV32pgRP5o1eHVwMIpuk4XQkDIhFbksurUw==", + "dependencies": { + "@bytecodealliance/preview2-shim": "^0.16.2", + "binaryen": "^116.0.0", + "chalk-template": "^1", + "commander": "^12", + "mkdirp": "^3", + "ora": "^8", + "terser": "^5" + }, + "bin": { + "jco": "src/jco.js" + } + }, + "node_modules/@bytecodealliance/jco/node_modules/binaryen": { + "version": "116.0.0", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-116.0.0.tgz", + "integrity": "sha512-Hp0dXC6Cb/rTwWEoUS2BRghObE7g/S9umKtxuTDt3f61G6fNTE/YVew/ezyy3IdHcLx3f17qfh6LwETgCfvWkQ==", + "bin": { + "wasm-opt": "bin/wasm-opt", + "wasm2js": "bin/wasm2js" + } + }, + "node_modules/@bytecodealliance/preview2-shim": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.16.2.tgz", + "integrity": "sha512-36MwesmbLSf3Y5/OHcS85iBaF0N92CQ4gpjtDVKSbrjxmrBKCWlWVfoQ03F/cqDg8k5K7pzVaVBH0XBIbTCfTQ==" + }, + "node_modules/@bytecodealliance/wizer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer/-/wizer-3.0.1.tgz", + "integrity": "sha512-f0NBiBHCNBkbFHTPRbA7aKf/t4KyNhi2KvSqw3QzCgi8wFF/uLZ0dhejj93rbiKO/iwWbmU7v9K3SVkW81mcjQ==", + "bin": { + "wizer": "wizer.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@bytecodealliance/wizer-darwin-arm64": "3.0.1", + "@bytecodealliance/wizer-darwin-x64": "3.0.1", + "@bytecodealliance/wizer-linux-arm64": "3.0.1", + "@bytecodealliance/wizer-linux-s390x": "3.0.1", + "@bytecodealliance/wizer-linux-x64": "3.0.1", + "@bytecodealliance/wizer-win32-x64": "3.0.1" + } + }, + "node_modules/@bytecodealliance/wizer-darwin-arm64": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-darwin-arm64/-/wizer-darwin-arm64-3.0.1.tgz", + "integrity": "sha512-/8KYSajyhO9koAE3qQhYfC6belZheJw9X3XqW7hrizTpj6n4z4OJFhhqwJmiYFUUsPtC7OxcXMFFPbTuSQPBcw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "wizer-darwin-arm64": "wizer" + } + }, + "node_modules/@bytecodealliance/wizer-darwin-x64": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-darwin-x64/-/wizer-darwin-x64-3.0.1.tgz", + "integrity": "sha512-bMReultN/r+W/BRXV0F+28U5dZwbQT/ZO0k4icZlhUhrv5/wpQJix7Z/ZvBnVQ+/JHb0QDUpFk2/zCtgkRXP6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "wizer-darwin-x64": "wizer" + } + }, + "node_modules/@bytecodealliance/wizer-linux-arm64": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-arm64/-/wizer-linux-arm64-3.0.1.tgz", + "integrity": "sha512-35ZhAeYxWK3bTqqgwysbBWlGlrlMNKNng3ZITQV2PAtafpE7aCeqywl7VAS4lLRG5eTb7wxNgN7zf8d3wiIFTQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "bin": { + "wizer-linux-arm64": "wizer" + } + }, + "node_modules/@bytecodealliance/wizer-linux-s390x": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-s390x/-/wizer-linux-s390x-3.0.1.tgz", + "integrity": "sha512-Smvy9mguEMtX0lupDLTPshXUzAHeOhgscr1bhGNjeCCLD1sd8rIjBvWV19Wtra0BL1zTuU2EPOHjR/4k8WoyDg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "bin": { + "wizer-linux-s390x": "wizer" + } + }, + "node_modules/@bytecodealliance/wizer-linux-x64": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-x64/-/wizer-linux-x64-3.0.1.tgz", + "integrity": "sha512-uUue78xl7iwndsGgTsagHLTLyLBVHhwzuywiwHt1xw8y0X0O8REKRLBoB7+LdM+pttDPdFtKJgbTFL4UPAA7Yw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "bin": { + "wizer-linux-x64": "wizer" + } + }, + "node_modules/@bytecodealliance/wizer-win32-x64": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-win32-x64/-/wizer-win32-x64-3.0.1.tgz", + "integrity": "sha512-ycd38sx1UTZpHZwh8IfH/4N3n0OQUB8awxkUSLXf9PolEd088YbxoPB3noHy4E+L2oYN7KZMrg9517pX0z2RhQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "bin": { + "wizer-win32-x64": "wizer" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/binaryen": { + "version": "117.0.0", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-117.0.0.tgz", + "integrity": "sha512-1D+O881OXxY737WPKfIgEscCn3vWGqTsd0m5nGKzvbtadVYw5pZ3eebineH/oV5c/rAW80Bojrsa6firSSIsUw==", + "bin": { + "wasm-as": "bin/wasm-as", + "wasm-ctor-eval": "bin/wasm-ctor-eval", + "wasm-dis": "bin/wasm-dis", + "wasm-merge": "bin/wasm-merge", + "wasm-metadce": "bin/wasm-metadce", + "wasm-opt": "bin/wasm-opt", + "wasm-reduce": "bin/wasm-reduce", + "wasm-shell": "bin/wasm-shell", + "wasm2js": "bin/wasm2js" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", + "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", + "dependencies": { + "chalk": "^5.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", + "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } +} diff --git a/test_files/components/javascript_decoder/package.json b/test_files/components/javascript_decoder/package.json new file mode 100644 index 0000000..ca118b5 --- /dev/null +++ b/test_files/components/javascript_decoder/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "@bytecodealliance/componentize-js": "^0.8.3", + "@bytecodealliance/jco": "^1.2.4", + "binaryen": "^117.0.0" + } +} diff --git a/test_files/components/javascript_decoder/src/index.js b/test_files/components/javascript_decoder/src/index.js new file mode 100644 index 0000000..add3212 --- /dev/null +++ b/test_files/components/javascript_decoder/src/index.js @@ -0,0 +1,17 @@ +import { log } from "component:decoder/host" + +const name = "Javascript Test Decoder" + +export const decoder = { + init() { + log(`${name} initialized`) + }, + name() { + return name + }, + formatSignalValue(value) { + return value + "!" + } +} + + diff --git a/test_files/components/javascript_decoder/wit/world.wit b/test_files/components/javascript_decoder/wit/world.wit new file mode 100644 index 0000000..9205cff --- /dev/null +++ b/test_files/components/javascript_decoder/wit/world.wit @@ -0,0 +1,16 @@ +package component:decoder; + +interface host { + log: func(message: string); +} + +interface decoder { + init: func(); + name: func() -> string; + format-signal-value: func(value: string) -> string; +} + +world component { + import host; + export decoder; +} diff --git a/test_files/components/python_decoder/.gitignore b/test_files/components/python_decoder/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/test_files/components/python_decoder/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/test_files/components/python_decoder/README.md b/test_files/components/python_decoder/README.md new file mode 100644 index 0000000..9c7fe5d --- /dev/null +++ b/test_files/components/python_decoder/README.md @@ -0,0 +1,10 @@ +How to create and build the Python component: + +1. `pip install componentize-py` +2. Create the `python_decoder` folder +3. `cd python_decoder` +4. Create `.gitignore` with content `__pycache__` +5. Create the `src` folder with the file `app.py` +6. Create the `wit` folder with the file `world.wit` +7. Update code as needed +8. `rm -rf src/bindings && componentize-py --wit-path wit/world.wit bindings src/bindings && componentize-py --wit-path wit/world.wit componentize src.app --output python_decoder.wasm` diff --git a/test_files/components/python_decoder/python_decoder.wasm b/test_files/components/python_decoder/python_decoder.wasm new file mode 100644 index 0000000..8e01a16 Binary files /dev/null and b/test_files/components/python_decoder/python_decoder.wasm differ diff --git a/test_files/components/python_decoder/src/app.py b/test_files/components/python_decoder/src/app.py new file mode 100644 index 0000000..30d6f57 --- /dev/null +++ b/test_files/components/python_decoder/src/app.py @@ -0,0 +1,17 @@ +from .bindings.component import exports +from .bindings.component.imports import host + +name = "Python Test Decoder" + +class Decoder(exports.Decoder): + def init(self) -> None: + # @TODO it panics with error `7: 0xae8683 - libcomponentize_py_runtime.so!componentize-py#Dispatch` + # - see https://github.com/bytecodealliance/componentize-py/blob/e20d9e6706ff1421cd8001449acb51eb9c87d0c6/runtime/src/lib.rs#L404 + # host.log(f"{name} initialized") + return None + + def name(self) -> str: + return name + + def format_signal_value(self, value: str) -> str: + return value + "!" diff --git a/test_files/components/python_decoder/src/bindings/component/__init__.py b/test_files/components/python_decoder/src/bindings/component/__init__.py new file mode 100644 index 0000000..2690a80 --- /dev/null +++ b/test_files/components/python_decoder/src/bindings/component/__init__.py @@ -0,0 +1,12 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from .types import Result, Ok, Err, Some + + + +class Component(Protocol): + pass diff --git a/test_files/components/python_decoder/src/bindings/component/exports/__init__.py b/test_files/components/python_decoder/src/bindings/component/exports/__init__.py new file mode 100644 index 0000000..fa97298 --- /dev/null +++ b/test_files/components/python_decoder/src/bindings/component/exports/__init__.py @@ -0,0 +1,24 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from ..types import Result, Ok, Err, Some + + +class Decoder(Protocol): + + @abstractmethod + def init(self) -> None: + raise NotImplementedError + + @abstractmethod + def name(self) -> str: + raise NotImplementedError + + @abstractmethod + def format_signal_value(self, value: str) -> str: + raise NotImplementedError + + diff --git a/test_files/components/python_decoder/src/bindings/component/exports/decoder.py b/test_files/components/python_decoder/src/bindings/component/exports/decoder.py new file mode 100644 index 0000000..794d5a1 --- /dev/null +++ b/test_files/components/python_decoder/src/bindings/component/exports/decoder.py @@ -0,0 +1,9 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from ..types import Result, Ok, Err, Some + + diff --git a/test_files/components/python_decoder/src/bindings/component/imports/__init__.py b/test_files/components/python_decoder/src/bindings/component/imports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test_files/components/python_decoder/src/bindings/component/imports/host.py b/test_files/components/python_decoder/src/bindings/component/imports/host.py new file mode 100644 index 0000000..527a50a --- /dev/null +++ b/test_files/components/python_decoder/src/bindings/component/imports/host.py @@ -0,0 +1,13 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from ..types import Result, Ok, Err, Some + + + +def log(message: str) -> None: + raise NotImplementedError + diff --git a/test_files/components/python_decoder/src/bindings/component/types.py b/test_files/components/python_decoder/src/bindings/component/types.py new file mode 100644 index 0000000..77ad379 --- /dev/null +++ b/test_files/components/python_decoder/src/bindings/component/types.py @@ -0,0 +1,23 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + + +S = TypeVar('S') +@dataclass +class Some(Generic[S]): + value: S + +T = TypeVar('T') +@dataclass +class Ok(Generic[T]): + value: T + +E = TypeVar('E') +@dataclass(frozen=True) +class Err(Generic[E], Exception): + value: E + +Result = Union[Ok[T], Err[E]] diff --git a/test_files/components/python_decoder/wit/world.wit b/test_files/components/python_decoder/wit/world.wit new file mode 100644 index 0000000..9205cff --- /dev/null +++ b/test_files/components/python_decoder/wit/world.wit @@ -0,0 +1,16 @@ +package component:decoder; + +interface host { + log: func(message: string); +} + +interface decoder { + init: func(); + name: func() -> string; + format-signal-value: func(value: string) -> string; +} + +world component { + import host; + export decoder; +} diff --git a/test_files/components/rust_decoder/Cargo.toml b/test_files/components/rust_decoder/Cargo.toml new file mode 100644 index 0000000..dde94b3 --- /dev/null +++ b/test_files/components/rust_decoder/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "rust_decoder" +version.workspace = true +edition.workspace = true +repository.workspace = true +authors.workspace = true +readme.workspace = true +publish.workspace = true + +[dependencies] +wit-bindgen-rt = { version = "0.26.0", features = ["bitflags"] } + +[lib] +crate-type = ["cdylib"] + +[profile.release] +codegen-units = 1 +opt-level = "s" +debug = false +strip = true +lto = true + +[package.metadata.component] +package = "component:rust-decoder" + +[package.metadata.component.dependencies] diff --git a/test_files/components/rust_decoder/README.md b/test_files/components/rust_decoder/README.md new file mode 100644 index 0000000..1375faf --- /dev/null +++ b/test_files/components/rust_decoder/README.md @@ -0,0 +1,7 @@ +How to create and build the Rust component: + +1. `cargo install cargo-component` +2. `cargo component new rust_decoder --lib` +3. `cd rust_decoder` +4. Update code as needed +5. `cargo component build --release --target wasm32-unknown-unknown && cp ../../../target/wasm32-unknown-unknown/release/rust_decoder.wasm .` diff --git a/test_files/components/rust_decoder/rust_decoder.wasm b/test_files/components/rust_decoder/rust_decoder.wasm new file mode 100644 index 0000000..4898d11 Binary files /dev/null and b/test_files/components/rust_decoder/rust_decoder.wasm differ diff --git a/test_files/components/rust_decoder/src/bindings.rs b/test_files/components/rust_decoder/src/bindings.rs new file mode 100644 index 0000000..b8ac8a9 --- /dev/null +++ b/test_files/components/rust_decoder/src/bindings.rs @@ -0,0 +1,220 @@ +// Generated by `wit-bindgen` 0.25.0. DO NOT EDIT! +// Options used: +#[allow(dead_code)] +pub mod component { + #[allow(dead_code)] + pub mod decoder { + #[allow(dead_code, clippy::all)] + pub mod host { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::__link_custom_section_describing_imports; + #[allow(unused_unsafe, clippy::all)] + pub fn log(message: &str) { + unsafe { + let vec0 = message; + let ptr0 = vec0.as_ptr().cast::(); + let len0 = vec0.len(); + + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "component:decoder/host")] + extern "C" { + #[link_name = "log"] + fn wit_import(_: *mut u8, _: usize); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: *mut u8, _: usize) { + unreachable!() + } + wit_import(ptr0.cast_mut(), len0); + } + } + } + } +} +#[allow(dead_code)] +pub mod exports { + #[allow(dead_code)] + pub mod component { + #[allow(dead_code)] + pub mod decoder { + #[allow(dead_code, clippy::all)] + pub mod decoder { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::super::__link_custom_section_describing_imports; + use super::super::super::super::_rt; + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_init_cabi() { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + T::init(); + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_name_cabi() -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::name(); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec2 = (result0.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + ::core::mem::forget(vec2); + *ptr1.add(4).cast::() = len2; + *ptr1.add(0).cast::<*mut u8>() = ptr2.cast_mut(); + ptr1 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_name(arg0: *mut u8) { + let l0 = *arg0.add(0).cast::<*mut u8>(); + let l1 = *arg0.add(4).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_format_signal_value_cabi( + arg0: *mut u8, + arg1: usize, + ) -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let len0 = arg1; + let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); + let result1 = T::format_signal_value(_rt::string_lift(bytes0)); + let ptr2 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec3 = (result1.into_bytes()).into_boxed_slice(); + let ptr3 = vec3.as_ptr().cast::(); + let len3 = vec3.len(); + ::core::mem::forget(vec3); + *ptr2.add(4).cast::() = len3; + *ptr2.add(0).cast::<*mut u8>() = ptr3.cast_mut(); + ptr2 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_format_signal_value(arg0: *mut u8) { + let l0 = *arg0.add(0).cast::<*mut u8>(); + let l1 = *arg0.add(4).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + } + pub trait Guest { + fn init(); + fn name() -> _rt::String; + fn format_signal_value(value: _rt::String) -> _rt::String; + } + #[doc(hidden)] + + macro_rules! __export_component_decoder_decoder_cabi{ + ($ty:ident with_types_in $($path_to_types:tt)*) => (const _: () = { + + #[export_name = "component:decoder/decoder#init"] + unsafe extern "C" fn export_init() { + $($path_to_types)*::_export_init_cabi::<$ty>() + } + #[export_name = "component:decoder/decoder#name"] + unsafe extern "C" fn export_name() -> *mut u8 { + $($path_to_types)*::_export_name_cabi::<$ty>() + } + #[export_name = "cabi_post_component:decoder/decoder#name"] + unsafe extern "C" fn _post_return_name(arg0: *mut u8,) { + $($path_to_types)*::__post_return_name::<$ty>(arg0) + } + #[export_name = "component:decoder/decoder#format-signal-value"] + unsafe extern "C" fn export_format_signal_value(arg0: *mut u8,arg1: usize,) -> *mut u8 { + $($path_to_types)*::_export_format_signal_value_cabi::<$ty>(arg0, arg1) + } + #[export_name = "cabi_post_component:decoder/decoder#format-signal-value"] + unsafe extern "C" fn _post_return_format_signal_value(arg0: *mut u8,) { + $($path_to_types)*::__post_return_format_signal_value::<$ty>(arg0) + } + };); + } + #[doc(hidden)] + pub(crate) use __export_component_decoder_decoder_cabi; + #[repr(align(4))] + struct _RetArea([::core::mem::MaybeUninit; 8]); + static mut _RET_AREA: _RetArea = _RetArea([::core::mem::MaybeUninit::uninit(); 8]); + } + } + } +} +mod _rt { + + #[cfg(target_arch = "wasm32")] + pub fn run_ctors_once() { + wit_bindgen_rt::run_ctors_once(); + } + pub unsafe fn cabi_dealloc(ptr: *mut u8, size: usize, align: usize) { + if size == 0 { + return; + } + let layout = alloc::Layout::from_size_align_unchecked(size, align); + alloc::dealloc(ptr as *mut u8, layout); + } + pub use alloc_crate::string::String; + pub use alloc_crate::vec::Vec; + pub unsafe fn string_lift(bytes: Vec) -> String { + if cfg!(debug_assertions) { + String::from_utf8(bytes).unwrap() + } else { + String::from_utf8_unchecked(bytes) + } + } + pub use alloc_crate::alloc; + extern crate alloc as alloc_crate; +} + +/// Generates `#[no_mangle]` functions to export the specified type as the +/// root implementation of all generated traits. +/// +/// For more information see the documentation of `wit_bindgen::generate!`. +/// +/// ```rust +/// # macro_rules! export{ ($($t:tt)*) => (); } +/// # trait Guest {} +/// struct MyType; +/// +/// impl Guest for MyType { +/// // ... +/// } +/// +/// export!(MyType); +/// ``` +#[allow(unused_macros)] +#[doc(hidden)] + +macro_rules! __export_component_impl { + ($ty:ident) => (self::export!($ty with_types_in self);); + ($ty:ident with_types_in $($path_to_types_root:tt)*) => ( + $($path_to_types_root)*::exports::component::decoder::decoder::__export_component_decoder_decoder_cabi!($ty with_types_in $($path_to_types_root)*::exports::component::decoder::decoder); + ) +} +#[doc(inline)] +pub(crate) use __export_component_impl as export; + +#[cfg(target_arch = "wasm32")] +#[link_section = "component-type:wit-bindgen:0.25.0:component:encoded world"] +#[doc(hidden)] +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 315] = *b"\ +\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07\xbb\x01\x01A\x02\x01\ +A\x04\x01B\x02\x01@\x01\x07messages\x01\0\x04\0\x03log\x01\0\x03\x01\x16componen\ +t:decoder/host\x05\0\x01B\x06\x01@\0\x01\0\x04\0\x04init\x01\0\x01@\0\0s\x04\0\x04\ +name\x01\x01\x01@\x01\x05values\0s\x04\0\x13format-signal-value\x01\x02\x04\x01\x19\ +component:decoder/decoder\x05\x01\x04\x01\x1bcomponent:decoder/component\x04\0\x0b\ +\x0f\x01\0\x09component\x03\0\0\0G\x09producers\x01\x0cprocessed-by\x02\x0dwit-c\ +omponent\x070.208.1\x10wit-bindgen-rust\x060.25.0"; + +#[inline(never)] +#[doc(hidden)] +#[cfg(target_arch = "wasm32")] +pub fn __link_custom_section_describing_imports() { + wit_bindgen_rt::maybe_link_cabi_realloc(); +} diff --git a/test_files/components/rust_decoder/src/lib.rs b/test_files/components/rust_decoder/src/lib.rs new file mode 100644 index 0000000..103c773 --- /dev/null +++ b/test_files/components/rust_decoder/src/lib.rs @@ -0,0 +1,30 @@ +#[allow(warnings)] +mod bindings; + +use bindings::component::decoder::host; +use bindings::exports::component::decoder::decoder; + +macro_rules! log { + ($($arg:tt)*) => (host::log(&format!($($arg)*))) +} + +static NAME: &str = "Rust Test Decoder"; + +struct Component; + +impl decoder::Guest for Component { + fn init() { + log!("'{NAME}' initialized") + } + + fn name() -> String { + NAME.to_string() + } + + fn format_signal_value(mut value: String) -> String { + value.push('!'); + value + } +} + +bindings::export!(Component with_types_in bindings); diff --git a/test_files/components/rust_decoder/wit/world.wit b/test_files/components/rust_decoder/wit/world.wit new file mode 100644 index 0000000..9205cff --- /dev/null +++ b/test_files/components/rust_decoder/wit/world.wit @@ -0,0 +1,16 @@ +package component:decoder; + +interface host { + log: func(message: string); +} + +interface decoder { + init: func(); + name: func() -> string; + format-signal-value: func(value: string) -> string; +} + +world component { + import host; + export decoder; +}