diff --git a/Cargo.lock b/Cargo.lock index dcc3e3d8..a071b505 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,7 +40,7 @@ dependencies = [ "flate2", "futures-core", "h2", - "http", + "http 0.2.12", "httparse", "httpdate", "itoa", @@ -76,7 +76,7 @@ checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" dependencies = [ "bytestring", "cfg-if", - "http", + "http 0.2.12", "regex", "regex-lite", "serde", @@ -263,6 +263,12 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[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" @@ -705,6 +711,9 @@ name = "bumpalo" version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +dependencies = [ + "allocator-api2", +] [[package]] name = "bv" @@ -836,6 +845,71 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" +[[package]] +name = "cap-fs-ext" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78efdd7378980d79c0f36b519e51191742d2c9f91ffa5e228fba9f3806d2e1" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes", + "windows-sys 0.59.0", +] + +[[package]] +name = "cap-primitives" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc15faeed2223d8b8e8cc1857f5861935a06d06713c4ac106b722ae9ce3c369" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes", + "ipnet", + "maybe-owned", + "rustix", + "windows-sys 0.59.0", + "winx", +] + +[[package]] +name = "cap-rand" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea13372b49df066d1ae654e5c6e41799c1efd9f6b36794b921e877ea4037977" +dependencies = [ + "ambient-authority", + "rand 0.8.5", +] + +[[package]] +name = "cap-std" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3dbd3e8e8d093d6ccb4b512264869e1281cdb032f7940bd50b2894f96f25609" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes", + "rustix", +] + +[[package]] +name = "cap-time-ext" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd736b20fc033f564a1995fb82fc349146de43aabba19c7368b4cb17d8f9ea53" +dependencies = [ + "ambient-authority", + "cap-primitives", + "iana-time-zone", + "once_cell", + "rustix", + "winx", +] + [[package]] name = "cargo-lock" version = "10.1.0" @@ -855,6 +929,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "cbindgen" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" +dependencies = [ + "heck 0.4.1", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.98", + "tempfile", + "toml", +] + [[package]] name = "cc" version = "1.2.16" @@ -978,7 +1070,7 @@ version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "syn 2.0.98", @@ -990,6 +1082,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + [[package]] name = "colorchoice" version = "1.0.3" @@ -1059,6 +1157,113 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-bforest" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e15d04a0ce86cb36ead88ad68cf693ffd6cda47052b9e0ac114bc47fd9cd23c4" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-bitset" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c6e3969a7ce267259ce244b7867c5d3bc9e65b0a87e81039588dfdeaede9f34" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-codegen" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c22032c4cb42558371cf516bb47f26cdad1819d3475c133e93c49f50ebf304e" +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 2.1.1", + "serde", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c904bc71c61b27fc57827f4a1379f29de64fe95653b620a3db77d59655eee0b8" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40180f5497572f644ce88c255480981ae2ec1d7bb4d8e0c0136a13b87a2f2ceb" + +[[package]] +name = "cranelift-control" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d132c6d0bd8a489563472afc171759da0707804a65ece7ceb15a8c6d7dd5ef" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d0d9618275474fbf679dd018ac6e009acbd6ae6850f6a67be33fb3b00b323" +dependencies = [ + "cranelift-bitset", + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-frontend" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fac41e16729107393174b0c9e3730fb072866100e1e64e80a1a963b2e484d57" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca20d576e5070044d0a72a9effc2deacf4d6aa650403189d8ea50126483944d" + +[[package]] +name = "cranelift-native" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dee82f3f1f2c4cba9177f1cc5e350fe98764379bcd29340caa7b01f85076c7" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -1357,6 +1562,47 @@ dependencies = [ "subtle", ] +[[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", +] + +[[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-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1380,6 +1626,18 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -1506,6 +1764,98 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "extism" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06c5ae419bb79082d6ad22fc907717b4a0655c4ff532c09346b4df28abdacba" +dependencies = [ + "anyhow", + "cbindgen", + "extism-convert", + "extism-manifest", + "glob", + "libc", + "serde", + "serde_json", + "sha2", + "toml", + "tracing", + "tracing-subscriber", + "ureq", + "url", + "uuid", + "wasi-common", + "wasmtime", + "wiggle", +] + +[[package]] +name = "extism-convert" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6630b9ecf2628b1ef32e3f9bb888ffc17e0eed5927ba11e72e8bc06e59fa9cf6" +dependencies = [ + "anyhow", + "base64 0.22.1", + "bytemuck", + "extism-convert-macros", + "prost", + "rmp-serde", + "serde", + "serde_json", +] + +[[package]] +name = "extism-convert-macros" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e030d6ea834ef4004764b4809832e7197469442e92feb7ca4307e827db7c98b8" +dependencies = [ + "manyhow", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "extism-manifest" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65df2772243a6e44caf547142196381a4947cf390cb1252c0205d9337aa0f237" +dependencies = [ + "base64 0.22.1", + "serde", + "serde_json", +] + +[[package]] +name = "extism-pdk" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd50f3ebae4132239ee188c00d91bda2b283db007213dd4bd6f3b4be4d3f82c" +dependencies = [ + "anyhow", + "base64 0.22.1", + "extism-convert", + "extism-manifest", + "extism-pdk-derive", + "serde", + "serde_json", +] + +[[package]] +name = "extism-pdk-derive" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a225e26f498571c273e095d9c2437acb0fd5d6ef3cb88d284d7e2d037d4d10" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -1530,6 +1880,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[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 = "feature-probe" version = "0.1.1" @@ -1591,6 +1952,17 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs-set-times" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2e6123af26f0f2c51cc66869137080199406754903cc926a7690401ce09cb4" +dependencies = [ + "io-lifetimes", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "funty" version = "2.0.0" @@ -1701,6 +2073,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.8.0", + "debugid", + "fxhash", + "serde", + "serde_json", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1735,12 +2120,29 @@ dependencies = [ ] [[package]] -name = "gimli" -version = "0.31.1" +name = "getset" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] +checksum = "f3586f256131df87204eb733da72e3d3eb4f343c639f4b7be279ac7c48baeafe" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +dependencies = [ + "fallible-iterator 0.3.0", + "indexmap", + "stable_deref_trait", +] + +[[package]] name = "git2" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1770,7 +2172,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", "indexmap", "slab", "tokio", @@ -1816,6 +2218,7 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash", + "serde", ] [[package]] @@ -1827,6 +2230,12 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -1894,6 +2303,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "httparse" version = "1.10.0" @@ -2059,6 +2479,12 @@ dependencies = [ "syn 2.0.98", ] +[[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" @@ -2149,6 +2575,28 @@ dependencies = [ "similar", ] +[[package]] +name = "io-extras" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" +dependencies = [ + "io-lifetimes", + "windows-sys 0.59.0", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + [[package]] name = "is-terminal" version = "0.4.15" @@ -2217,6 +2665,26 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +[[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 = "jobserver" version = "0.1.32" @@ -2286,6 +2754,18 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "lexical-core" version = "0.8.5" @@ -2384,6 +2864,16 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.8.0", + "libc", +] + [[package]] name = "librocksdb-sys" version = "0.16.0+8.10.0" @@ -2509,6 +2999,38 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + [[package]] name = "matchers" version = "0.1.0" @@ -2528,6 +3050,12 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "md-5" version = "0.10.6" @@ -2561,6 +3089,7 @@ dependencies = [ "dhat", "enumflags2", "env_logger", + "extism", "flate2", "futures", "hgvs", @@ -2570,6 +3099,7 @@ dependencies = [ "itertools 0.14.0", "jsonl", "log", + "mehari-plugins", "memmap2", "nom 8.0.0", "noodles 0.77.0", @@ -2609,12 +3139,45 @@ dependencies = [ "zstd", ] +[[package]] +name = "mehari-plugin-vep-nmd" +version = "0.1.0" +dependencies = [ + "extism-convert", + "extism-pdk", + "mehari-plugins", + "serde", + "serde_json", +] + +[[package]] +name = "mehari-plugins" +version = "0.1.0" +dependencies = [ + "anyhow", + "criterion", + "derive-new 0.7.0", + "derive_builder", + "extism", + "getset", + "serde", +] + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[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.5" @@ -3128,6 +3691,9 @@ version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ + "crc32fast", + "hashbrown 0.15.2", + "indexmap", "memchr", ] @@ -3228,7 +3794,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9" dependencies = [ - "heck", + "heck 0.5.0", "itertools 0.13.0", "prost", "prost-types", @@ -3374,6 +3940,18 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "postgres" version = "0.19.10" @@ -3484,6 +4062,39 @@ dependencies = [ "toml_edit", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + [[package]] name = "proc-macro2" version = "1.0.93" @@ -3534,7 +4145,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ - "heck", + "heck 0.5.0", "itertools 0.14.0", "log", "multimap", @@ -3570,6 +4181,15 @@ dependencies = [ "prost", ] +[[package]] +name = "psm" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88" +dependencies = [ + "cc", +] + [[package]] name = "ptr_meta" version = "0.1.4" @@ -3590,6 +4210,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "pulley-interpreter" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d95f8575df49a2708398182f49a888cf9dc30210fb1fd2df87c889edcee75d" +dependencies = [ + "cranelift-bitset", + "log", + "sptr", + "wasmtime-math", +] + [[package]] name = "quick-xml" version = "0.26.0" @@ -3732,6 +4364,31 @@ dependencies = [ "bitflags 2.8.0", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regalloc2" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145c1c267e14f20fb0f88aa76a1c5ffec42d592c1d28b3cd9148ae35916158d3" +dependencies = [ + "allocator-api2", + "bumpalo", + "hashbrown 0.15.2", + "log", + "rustc-hash 2.1.1", + "smallvec", +] + [[package]] name = "regex" version = "1.11.1" @@ -3806,6 +4463,20 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "ring" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rkyv" version = "0.7.45" @@ -3835,6 +4506,28 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rocksdb" version = "0.22.0" @@ -3994,11 +4687,54 @@ checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.8.0", "errno", + "itoa", "libc", "linux-raw-sys", + "once_cell", "windows-sys 0.59.0", ] +[[package]] +name = "rustls" +version = "0.23.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.19" @@ -4196,6 +4932,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shellexpand" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +dependencies = [ + "dirs", +] + [[package]] name = "shlex" version = "1.3.0" @@ -4262,6 +5007,9 @@ name = "smallvec" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -4273,6 +5021,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[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" @@ -4367,7 +5121,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", @@ -4380,7 +5134,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", @@ -4449,12 +5203,34 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "system-interface" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4592f674ce18521c2a81483873a49596655b179f71c5e05d10c1fe66c78745" +dependencies = [ + "bitflags 2.8.0", + "cap-fs-ext", + "cap-std", + "fd-lock", + "io-lifetimes", + "rustix", + "windows-sys 0.59.0", + "winx", +] + [[package]] name = "tap" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" + [[package]] name = "temp_testdir" version = "0.2.3" @@ -4475,6 +5251,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -4782,6 +5567,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "trait-variant" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "triple_accel" version = "0.4.0" @@ -4845,12 +5641,54 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "unsafe-libyaml" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06f78313c985f2fba11100dd06d60dd402d0cabb458af4d94791b8e09c025323" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "ureq-proto", + "utf-8", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64adb55464bad1ab1aa9229133d0d59d2f679180f4d15f0d9debe616f541f25e" +dependencies = [ + "base64 0.22.1", + "http 1.2.0", + "httparse", + "log", +] + [[package]] name = "url" version = "2.5.4" @@ -4868,6 +5706,12 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf16_iter" version = "1.0.5" @@ -5016,6 +5860,31 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasi-common" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe3101bd34deeb64225431f8b1b1793c87e7cad94383464878b3f90da6995977" +dependencies = [ + "anyhow", + "bitflags 2.8.0", + "cap-fs-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "io-extras", + "io-lifetimes", + "log", + "rustix", + "system-interface", + "thiserror 1.0.69", + "tracing", + "wasmtime", + "wiggle", + "windows-sys 0.59.0", +] + [[package]] name = "wasite" version = "0.1.0" @@ -5080,6 +5949,345 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.221.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc8444fe4920de80a4fe5ab564fff2ae58b6b73166b89751f8c6c93509da32e5" +dependencies = [ + "leb128", + "wasmparser 0.221.3", +] + +[[package]] +name = "wasm-encoder" +version = "0.226.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d81b727619aec227dce83e7f7420d4e56c79acd044642a356ea045b98d4e13" +dependencies = [ + "leb128fmt", + "wasmparser 0.226.0", +] + +[[package]] +name = "wasmparser" +version = "0.221.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" +dependencies = [ + "bitflags 2.8.0", + "hashbrown 0.15.2", + "indexmap", + "semver 1.0.25", + "serde", +] + +[[package]] +name = "wasmparser" +version = "0.226.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc28600dcb2ba68d7e5f1c3ba4195c2bddc918c0243fd702d0b6dbd05689b681" +dependencies = [ + "bitflags 2.8.0", + "indexmap", + "semver 1.0.25", +] + +[[package]] +name = "wasmprinter" +version = "0.221.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7343c42a97f2926c7819ff81b64012092ae954c5d83ddd30c9fcdefd97d0b283" +dependencies = [ + "anyhow", + "termcolor", + "wasmparser 0.221.3", +] + +[[package]] +name = "wasmtime" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11976a250672556d1c4c04c6d5d7656ac9192ac9edc42a4587d6c21460010e69" +dependencies = [ + "addr2line", + "anyhow", + "async-trait", + "bitflags 2.8.0", + "bumpalo", + "cc", + "cfg-if", + "encoding_rs", + "fxprof-processed-profile", + "gimli", + "hashbrown 0.14.5", + "indexmap", + "ittapi", + "libc", + "log", + "mach2", + "memfd", + "object", + "once_cell", + "paste", + "postcard", + "psm", + "pulley-interpreter", + "rayon", + "rustix", + "semver 1.0.25", + "serde", + "serde_derive", + "serde_json", + "smallvec", + "sptr", + "target-lexicon", + "trait-variant", + "wasm-encoder 0.221.3", + "wasmparser 0.221.3", + "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-math", + "wasmtime-slab", + "wasmtime-versioned-export-macros", + "wasmtime-winch", + "wat", + "windows-sys 0.59.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f178b0d125201fbe9f75beaf849bd3e511891f9e45ba216a5b620802ccf64f2" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-cache" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1161c8f62880deea07358bc40cceddc019f1c81d46007bc390710b2fe24ffc" +dependencies = [ + "anyhow", + "base64 0.21.7", + "directories-next", + "log", + "postcard", + "rustix", + "serde", + "serde_derive", + "sha2", + "toml", + "windows-sys 0.59.0", + "zstd", +] + +[[package]] +name = "wasmtime-component-macro" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d74de6592ed945d0a602f71243982a304d5d02f1e501b638addf57f42d57dfaf" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.98", + "wasmtime-component-util", + "wasmtime-wit-bindgen", + "wit-parser", +] + +[[package]] +name = "wasmtime-component-util" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707dc7b3c112ab5a366b30cfe2fb5b2f8e6a0f682f16df96a5ec582bfe6f056e" + +[[package]] +name = "wasmtime-cranelift" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366be722674d4bf153290fbcbc4d7d16895cc82fb3e869f8d550ff768f9e9e87" +dependencies = [ + "anyhow", + "cfg-if", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "gimli", + "itertools 0.12.1", + "log", + "object", + "smallvec", + "target-lexicon", + "thiserror 1.0.69", + "wasmparser 0.221.3", + "wasmtime-environ", + "wasmtime-versioned-export-macros", +] + +[[package]] +name = "wasmtime-environ" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdadc1af7097347aa276a4f008929810f726b5b46946971c660b6d421e9994ad" +dependencies = [ + "anyhow", + "cpp_demangle", + "cranelift-bitset", + "cranelift-entity", + "gimli", + "indexmap", + "log", + "object", + "postcard", + "rustc-demangle", + "semver 1.0.25", + "serde", + "serde_derive", + "smallvec", + "target-lexicon", + "wasm-encoder 0.221.3", + "wasmparser 0.221.3", + "wasmprinter", + "wasmtime-component-util", +] + +[[package]] +name = "wasmtime-fiber" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccba90d4119f081bca91190485650730a617be1fff5228f8c4757ce133d21117" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "rustix", + "wasmtime-asm-macros", + "wasmtime-versioned-export-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e7b61488a5ee00c35c8c22de707c36c0aecacf419a3be803a6a2ba5e860f56a" +dependencies = [ + "object", + "rustix", + "wasmtime-versioned-export-macros", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec5e8552e01692e6c2e5293171704fed8abdec79d1a6995a0870ab190e5747d1" +dependencies = [ + "anyhow", + "cfg-if", + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "wasmtime-math" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29210ec2aa25e00f4d54605cedaf080f39ec01a872c5bd520ad04c67af1dde17" +dependencies = [ + "libm", +] + +[[package]] +name = "wasmtime-slab" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb5821a96fa04ac14bc7b158bb3d5cd7729a053db5a74dad396cd513a5e5ccf" + +[[package]] +name = "wasmtime-versioned-export-macros" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ff86db216dc0240462de40c8290887a613dddf9685508eb39479037ba97b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "wasmtime-winch" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdbabfb8f20502d5e1d81092b9ead3682ae59988487aafcd7567387b7a43cf8f" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "object", + "target-lexicon", + "wasmparser 0.221.3", + "wasmtime-cranelift", + "wasmtime-environ", + "winch-codegen", +] + +[[package]] +name = "wasmtime-wit-bindgen" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "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 = "226.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb903956d0151eabb6c30a2304dd61e5c8d7182805226120c2b6d611fb09a26" +dependencies = [ + "bumpalo", + "leb128fmt", + "memchr", + "unicode-width", + "wasm-encoder 0.226.0", +] + +[[package]] +name = "wat" +version = "1.226.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f89a90ef2c401b8b5b2b704020bfa7a7f69b93c3034c7a4b4a88e21e9966581" +dependencies = [ + "wast 226.0.0", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -5100,6 +6308,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "whoami" version = "1.5.2" @@ -5121,6 +6338,49 @@ dependencies = [ "safe_arch", ] +[[package]] +name = "wiggle" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9af35bc9629c52c261465320a9a07959164928b4241980ba1cf923b9e6751d" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.8.0", + "thiserror 1.0.69", + "tracing", + "wasmtime", + "wiggle-macro", + "witx", +] + +[[package]] +name = "wiggle-generate" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf267dd05673912c8138f4b54acabe6bd53407d9d1536f0fadb6520dd16e101" +dependencies = [ + "anyhow", + "heck 0.5.0", + "proc-macro2", + "quote", + "shellexpand", + "syn 2.0.98", + "witx", +] + +[[package]] +name = "wiggle-macro" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c5c473d4198e6c2d377f3809f713ff0c110cab88a0805ae099a82119ee250c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "wiggle-generate", +] + [[package]] name = "winapi" version = "0.3.9" @@ -5152,6 +6412,24 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winch-codegen" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f849ef2c5f46cb0a20af4b4487aaa239846e52e2c03f13fa3c784684552859c" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "regalloc2", + "smallvec", + "target-lexicon", + "thiserror 1.0.69", + "wasmparser 0.221.3", + "wasmtime-cranelift", + "wasmtime-environ", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -5258,6 +6536,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winx" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" +dependencies = [ + "bitflags 2.8.0", + "windows-sys 0.59.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.33.0" @@ -5267,6 +6555,36 @@ dependencies = [ "bitflags 2.8.0", ] +[[package]] +name = "wit-parser" +version = "0.221.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "896112579ed56b4a538b07a3d16e562d101ff6265c46b515ce0c701eef16b2ac" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.25", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.221.3", +] + +[[package]] +name = "witx" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +dependencies = [ + "anyhow", + "log", + "thiserror 1.0.69", + "wast 35.0.2", +] + [[package]] name = "write16" version = "1.0.0" @@ -5389,6 +6707,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zerovec" version = "0.10.4" diff --git a/Cargo.toml b/Cargo.toml index 8f5425ab..81278964 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,28 @@ +[workspace] +members = [ + "mehari-plugins", + "mehari-plugin-vep-nmd", +] +resolver = "2" + +[workspace.package] +homepage = "https://github.com/varfish-org/mehari" +repository = "https://github.com/varfish-org/mehari" +license = "MIT" +edition = "2021" +readme = "README.md" + [package] name = "mehari" version = "0.32.0" -edition = "2021" authors = ["Manuel Holtgrewe "] description = "Variant effect prediction all in Rust" -license = "MIT" -repository = "https://github.com/varfish-org/mehari" -readme = "README.md" rust-version = "1.75.0" +edition = "2021" +license.workspace = true +homepage.workspace = true +repository.workspace = true +readme.workspace = true [features] default = [] @@ -79,6 +94,8 @@ zstd = "0.13" utoipa = { version = "5.2.0", features = ["actix_extras", "chrono", "indexmap", "openapi_extensions", "preserve_order", "yaml"] } utoipa-swagger-ui = { version = "9.0.0", features = ["actix-web"] } memmap2 = "0.9.5" +extism = "1.1.0" +mehari-plugins = { path = "mehari-plugins" } [dependencies.dhat] version = "0.3.3" diff --git a/mehari-plugin-vep-nmd/.cargo/config.toml b/mehari-plugin-vep-nmd/.cargo/config.toml new file mode 100644 index 00000000..f4e8c002 --- /dev/null +++ b/mehari-plugin-vep-nmd/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +target = "wasm32-unknown-unknown" diff --git a/mehari-plugin-vep-nmd/Cargo.toml b/mehari-plugin-vep-nmd/Cargo.toml new file mode 100644 index 00000000..88156ee0 --- /dev/null +++ b/mehari-plugin-vep-nmd/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "mehari-plugin-vep-nmd" +version = "0.1.0" +authors = ["Till Hartmann "] +description = "NMD plugin for mehari, based on VEP's NMD plugin" +edition = "2021" +license.workspace = true +homepage.workspace = true +repository.workspace = true +readme.workspace = true + +# Once https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#per-package-target is stable, use that. +# The .cargo/config.toml is ignored by Cargo (in the parent workspace). +# Running cargo build from the mehari-plugin-vep-nmd directory (instead of from the parent mehari dir) +# does pick up the target. +# forced-target = "wasm32-unknown-unknown" + +[lib] +crate_type = ["cdylib"] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +extism-pdk = "1.1.0" +extism-convert = "1.2.0" +serde = { version = "1.0.197", features = ["derive"] } +serde_json = "1.0.115" +mehari-plugins = { path = "../mehari-plugins" } diff --git a/mehari-plugin-vep-nmd/src/lib.rs b/mehari-plugin-vep-nmd/src/lib.rs new file mode 100644 index 00000000..6e94fddf --- /dev/null +++ b/mehari-plugin-vep-nmd/src/lib.rs @@ -0,0 +1,99 @@ +use extism_convert::Json; +use extism_pdk::*; + +use mehari_plugins::*; + +#[plugin_fn] +pub fn process(Json(tva): Json) -> FnResult>> { + Ok(transcript_escapes_nmd(&tva).then_some(Json(Annotation::new("NMD".into())))) +} + +#[plugin_fn] +pub fn feature_type() -> FnResult { + Ok("Transcript".into()) +} + +#[plugin_fn] +pub fn header_info() -> FnResult> { + Ok(Json(HeaderInfo { + tag: "NMD".into(), + description: "Nonsense-mediated mRNA decay escaping variants prediction".into(), + })) +} + +// Core logic for NMD prediction +fn transcript_escapes_nmd(tva: &TranscriptVariationAllele) -> bool { + // To qualify for NMD, at least one of the following consequences is required: + // "stop_gained", "frameshift_variant", "splice_donor_variant", "splice_acceptor_variant", + if !tva + .overlap_consequences() + .iter() + .any(|oc| INCLUDE_SO.contains(&oc.so_term().as_ref())) + { + return false; + } + + let transcript = tva.transcript(); + let exons = transcript.exons(); + let strand = transcript.strand(); + let variant_feature_end_position = tva.variation_feature().seq_region().end(); + + // Rules for NMD prediction + variant_within_last_exon(variant_feature_end_position, exons) + || variant_upstream_of_penultimate_exon(variant_feature_end_position, strand, exons) + || variant_within_first_100_coding_bases(tva.transcript_variation()) + || variant_is_intronless(transcript) +} + +// Included SO terms +const INCLUDE_SO: [&str; 4] = [ + "stop_gained", + "frameshift_variant", + "splice_donor_variant", + "splice_acceptor_variant", +]; + +/// Checks whether the variant location falls within the last exon of the transcript +fn variant_within_last_exon(variant_feature_end_position: u64, exons: &[Exon]) -> bool { + let vf_end = variant_feature_end_position; + exons + .last() + .map(|exon| vf_end >= exon.start() && vf_end <= exon.end()) + .unwrap_or(false) +} + +fn variant_upstream_of_penultimate_exon( + variant_feature_end_position: u64, + strand: isize, + exons: &[Exon], +) -> bool { + let vf_end = variant_feature_end_position; + exons + .get(exons.len() - 2) + .map(|second_last_exon| { + let coding_region_end = if strand == -1 { + second_last_exon.start().saturating_add(51) + } else { + second_last_exon.end().saturating_sub(51) + }; + vf_end >= coding_region_end && vf_end <= second_last_exon.end() + }) + .unwrap_or(false) +} + +fn variant_within_first_100_coding_bases(tv: &TranscriptVariation) -> bool { + tv.cds().end() <= 101 +} + +fn variant_is_intronless(transcript: &Transcript) -> bool { + !transcript.has_introns() +} + +#[cfg(test)] +mod tests { + + #[test] + fn test_has_nmd() { + panic!() + } +} diff --git a/mehari-plugins/Cargo.toml b/mehari-plugins/Cargo.toml new file mode 100644 index 00000000..5bdc4088 --- /dev/null +++ b/mehari-plugins/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "mehari-plugins" +version = "0.1.0" +authors = ["Till Hartmann "] +edition = "2021" +license.workspace = true +homepage.workspace = true +repository.workspace = true +readme.workspace = true + +[dependencies] +serde = { version = "1.0.197", features = ["derive"] } +anyhow = "1.0.81" +getset = "0.1.2" +derive_builder = "0.20.0" +derive-new = "0.7.0" + +[dev-dependencies] +criterion = { version = "0.5.1", features = ["html_reports"] } +extism = "1.2.0" + +[[bench]] +name = "plugin_calling" +harness = false \ No newline at end of file diff --git a/mehari-plugins/benches/plugin_calling.rs b/mehari-plugins/benches/plugin_calling.rs new file mode 100644 index 00000000..1e0b473a --- /dev/null +++ b/mehari-plugins/benches/plugin_calling.rs @@ -0,0 +1,151 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use anyhow::Result; +use extism::convert::Json; +use extism::{FromBytesOwned, Manifest, Plugin, ToBytes, Wasm}; +use mehari_plugins::*; +use std::path::PathBuf; + +fn call_nmd_plugin(tva: &TranscriptVariationAllele, plugin: &mut Plugin) -> Result { + if let Some(Json(result)) = plugin + .call::, Option>>( + "process", + Json(tva.clone()), + )? + { + Ok(result.annotation == "NMD") + } else { + Ok(false) + } +} + +fn call_nmd_native_with_conversion(tva: &TranscriptVariationAllele) -> Result { + let tva_json = Json(tva).to_bytes().unwrap(); + let result = call_nmd_native(tva); + let Json(_tva) = + black_box(Json::::from_bytes_owned(&tva_json).unwrap()); + result +} + +fn call_nmd_native(tva: &TranscriptVariationAllele) -> Result { + fn transcript_escapes_nmd(tva: &TranscriptVariationAllele) -> bool { + // To qualify for NMD, at least one of the following consequences is required: + // "stop_gained", "frameshift_variant", "splice_donor_variant", "splice_acceptor_variant", + if !tva + .overlap_consequences() + .iter() + .any(|oc| INCLUDE_SO.contains(&oc.so_term().as_ref())) + { + return false; + } + + let transcript = tva.transcript(); + let exons = transcript.exons(); + let strand = transcript.strand(); + let variant_feature_end_position = tva.variation_feature().seq_region().end(); + + // Rules for NMD prediction + variant_within_last_exon(variant_feature_end_position, exons) + || variant_upstream_of_penultimate_exon(variant_feature_end_position, strand, exons) + || variant_within_first_100_coding_bases(tva.transcript_variation()) + || variant_is_intronless(transcript) + } + + // Included SO terms + const INCLUDE_SO: [&str; 4] = [ + "stop_gained", + "frameshift_variant", + "splice_donor_variant", + "splice_acceptor_variant", + ]; + + /// Checks whether the variant location falls within the last exon of the transcript + fn variant_within_last_exon(variant_feature_end_position: u64, exons: &[Exon]) -> bool { + let vf_end = variant_feature_end_position; + exons + .last() + .map(|exon| vf_end >= exon.start() && vf_end <= exon.end()) + .unwrap_or(false) + } + + fn variant_upstream_of_penultimate_exon( + variant_feature_end_position: u64, + strand: isize, + exons: &[Exon], + ) -> bool { + let vf_end = variant_feature_end_position; + exons + .get(exons.len() - 2) + .map(|second_last_exon| { + let coding_region_end = if strand == -1 { + second_last_exon.start().saturating_add(51) + } else { + second_last_exon.end().saturating_sub(51) + }; + vf_end >= coding_region_end && vf_end <= second_last_exon.end() + }) + .unwrap_or(false) + } + + fn variant_within_first_100_coding_bases(tv: &TranscriptVariation) -> bool { + tv.cds().end() <= 101 + } + + fn variant_is_intronless(transcript: &Transcript) -> bool { + !transcript.has_introns() + } + Ok(transcript_escapes_nmd(tva)) +} + +fn criterion_benchmark(c: &mut Criterion) { + let mut group = c.benchmark_group("wasm-vs-native"); + group.significance_level(0.1).sample_size(1000); + + // setup input data + let tva = TranscriptVariationAlleleBuilder::default() + .transcript( + TranscriptBuilder::default() + .introns(vec![Intron::new(10, 20), Intron::new(30, 40)]) + .exons(vec![ + Exon::new(0, 10), + Exon::new(20, 30), + Exon::new(40, 100), + ]) + .strand(-1) + .build() + .unwrap(), + ) + .transcript_variation(TranscriptVariation::new(CodingSequence::new(0, 100))) + .variation_feature(VariationFeature::new(SeqRegion::new(15, 25))) + .overlap_consequences(vec![OverlapConsequence::new("stop_gained".into())]) + .build() + .unwrap(); + + // initialize plugin only once + let mut plugin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + plugin_path.push("../target/wasm32-unknown-unknown/release/mehari_plugin_vep_nmd.wasm"); + let url = Wasm::file(plugin_path); + let manifest = Manifest::new([url]); + let mut plugin = Plugin::new(manifest, [], true).unwrap(); + + group.bench_function("call nmd plugin wasm optimized", |b| { + b.iter(|| call_nmd_plugin(black_box(&tva), black_box(&mut plugin))) + }); + + group.bench_function("call nmd plugin native", |b| { + // cloning here because `tva` is cloned inside `call_nmd_plugin` + // (and we do not want to measure the difference clone makes) + b.iter(|| call_nmd_native(black_box(&(tva.clone())))) + }); + + group.bench_function("call nmd plugin with conversion", |b| { + // cloning here because `tva` is cloned inside `call_nmd_plugin` + // (and we do not want to measure the difference clone makes) + b.iter(|| call_nmd_native_with_conversion(black_box(&(tva.clone())))) + }); + + group.finish(); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/mehari-plugins/src/lib.rs b/mehari-plugins/src/lib.rs new file mode 100644 index 00000000..0d1a8b6d --- /dev/null +++ b/mehari-plugins/src/lib.rs @@ -0,0 +1,88 @@ +/// Contains (placeholders for) structs and traits for the plugin interface. +use derive_builder::Builder; +use derive_new::new; +use getset::{CopyGetters, Getters}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, new)] +pub struct Annotation { + pub annotation: String +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct HeaderInfo { + pub tag: String, + pub description: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Getters, Builder)] +#[getset(get = "pub")] +pub struct TranscriptVariationAllele { + transcript: Transcript, + transcript_variation: TranscriptVariation, + variation_feature: VariationFeature, + overlap_consequences: Vec, +} + +#[derive( + Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Getters, CopyGetters, Builder, Default, +)] +pub struct Transcript { + #[getset(get = "pub")] + introns: Vec, + #[getset(get = "pub")] + exons: Vec, + #[getset(get_copy = "pub")] + strand: isize, +} + +impl Transcript { + pub fn has_introns(&self) -> bool { + !self.introns.is_empty() + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Getters, new)] +#[getset(get = "pub")] +pub struct TranscriptVariation { + cds: CodingSequence, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, CopyGetters, new)] +#[getset(get_copy = "pub")] +pub struct CodingSequence { + start: u64, + end: u64, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, CopyGetters, new)] +#[getset(get_copy = "pub")] +pub struct Intron { + start: u64, + end: u64, +} +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, CopyGetters, new)] +#[getset(get_copy = "pub")] +pub struct Exon { + start: u64, + end: u64, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Getters, new, Default)] +#[getset(get = "pub")] +pub struct OverlapConsequence { + so_term: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Getters, new)] +#[getset(get = "pub")] +pub struct VariationFeature { + seq_region: SeqRegion, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, CopyGetters, new)] +#[getset(get_copy = "pub")] +pub struct SeqRegion { + start: u64, + end: u64, +} diff --git a/src/lib.rs b/src/lib.rs index 4b993995..aaa448d3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,6 +27,8 @@ pub mod ped; pub mod server; pub mod verify; +pub mod plugins; + /// Information about the build. pub mod built_info { include!(concat!(env!("OUT_DIR"), "/built.rs")); diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs new file mode 100644 index 00000000..00f225f9 --- /dev/null +++ b/src/plugins/mod.rs @@ -0,0 +1,65 @@ +#[cfg(test)] +mod tests { + use anyhow::Result; + use extism::convert::Json; + use extism::{Manifest, Plugin, Wasm}; + use mehari_plugins::*; + use std::path::PathBuf; + + #[test] + fn nmd_plugin_header_information() -> Result<()> { + let mut plugin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + plugin_path.push("target/wasm32-unknown-unknown/debug/mehari_plugin_vep_nmd.wasm"); + let url = Wasm::file(plugin_path); + let manifest = Manifest::new([url]); + let mut plugin = Plugin::new(&manifest, [], true)?; + + let Json(header_info) = plugin.call::<(), Json>("header_info", ())?; + + assert_eq!( + header_info, + HeaderInfo { + tag: "NMD".into(), + description: "Nonsense-mediated mRNA decay escaping variants prediction".into(), + } + ); + Ok(()) + } + + #[test] + fn call_nmd_plugin() -> Result<()> { + let tva = TranscriptVariationAlleleBuilder::default() + .transcript( + TranscriptBuilder::default() + .introns(vec![Intron::new(10, 20), Intron::new(30, 40)]) + .exons(vec![ + Exon::new(0, 10), + Exon::new(20, 30), + Exon::new(40, 100), + ]) + .strand(-1) + .build()?, + ) + .transcript_variation(TranscriptVariation::new(CodingSequence::new(0, 100))) + .variation_feature(VariationFeature::new(SeqRegion::new(15, 25))) + .overlap_consequences(vec![OverlapConsequence::new("stop_gained".into())]) + .build()?; + + let mut plugin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + plugin_path.push("target/wasm32-unknown-unknown/debug/mehari_plugin_vep_nmd.wasm"); + let url = Wasm::file(plugin_path); + let manifest = Manifest::new([url]); + let mut plugin = Plugin::new(&manifest, [], true)?; + if let Some(Json(result)) = plugin + .call::, Option>>( + "process", + Json(tva), + )? + { + assert_eq!(result, Annotation::new("NMD".into())); + } else { + panic!() + } + Ok(()) + } +}