From c74e3ddb3ecff9d76ee2bc29fd747ada924e92f6 Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Mon, 21 Mar 2022 13:52:18 +0100 Subject: [PATCH 01/13] Adding Rust Python Server --- Cargo.lock | 2966 ++++++++++++++++++++++++++++++++++++++++++++++--- Cargo.toml | 11 +- app.py | 3 + src/lib.rs | 1 + src/main.rs | 70 +- src/server.rs | 36 + 6 files changed, 2904 insertions(+), 183 deletions(-) create mode 100644 app.py create mode 100644 src/server.rs diff --git a/Cargo.lock b/Cargo.lock index c08c3699..c634ade2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,323 +3,2961 @@ version = 3 [[package]] -name = "ansi_term" -version = "0.12.1" +name = "aes" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "winapi", + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug 0.3.0", ] [[package]] -name = "atty" -version = "0.2.14" +name = "aho-corasick" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ - "hermit-abi", - "libc", - "winapi", + "memchr", ] [[package]] -name = "autocfg" -version = "1.1.0" +name = "ansi_term" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] [[package]] -name = "bitflags" -version = "1.3.2" +name = "anyhow" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27" [[package]] -name = "clap" -version = "2.34.0" +name = "async-attributes" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim", - "textwrap", - "unicode-width", - "vec_map", + "quote", + "syn", ] [[package]] -name = "dora-rs" -version = "0.1.0" +name = "async-channel" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" dependencies = [ - "eyre", - "serde", - "serde_yaml", - "structopt", + "concurrent-queue", + "event-listener", + "futures-core", ] [[package]] -name = "eyre" -version = "0.6.7" +name = "async-executor" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9289ed2c0440a6536e65119725cf91fc2c6b5e513bfd2e36e1134d7cca6ca12f" +checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" dependencies = [ - "indenter", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", "once_cell", + "slab", ] [[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "heck" -version = "0.3.3" +name = "async-global-executor" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +checksum = "c026b7e44f1316b567ee750fea85103f87fcb80792b860e979f221259796ca0a" dependencies = [ - "unicode-segmentation", + "async-channel", + "async-executor", + "async-io", + "async-mutex", + "blocking", + "futures-lite", + "num_cpus", + "once_cell", + "tokio", ] [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "async-io" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" dependencies = [ + "concurrent-queue", + "futures-lite", "libc", + "log", + "once_cell", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "winapi", ] [[package]] -name = "indenter" -version = "0.3.3" +name = "async-lock" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" +dependencies = [ + "event-listener", +] [[package]] -name = "indexmap" -version = "1.8.0" +name = "async-mutex" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" dependencies = [ - "autocfg", - "hashbrown", + "event-listener", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "async-process" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "83137067e3a2a6a06d67168e49e68a0957d215410473a740cea95a2425c0b7c6" +dependencies = [ + "async-io", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "libc", + "once_cell", + "signal-hook", + "winapi", +] [[package]] -name = "libc" -version = "0.2.119" +name = "async-rustls" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" +checksum = "9c86f33abd5a4f3e2d6d9251a9e0c6a7e52eb1113caf893dae8429bf4a53f378" +dependencies = [ + "futures-lite", + "rustls 0.19.1", + "webpki 0.21.4", +] [[package]] -name = "linked-hash-map" -version = "0.5.4" +name = "async-std" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "f8056f1455169ab86dd47b47391e4ab0cbd25410a70e9fe675544f49bafaf952" +dependencies = [ + "async-attributes", + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "num_cpus", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] [[package]] -name = "once_cell" -version = "1.9.0" +name = "async-task" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "async-trait" +version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", "syn", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "atomic-waker" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "hermit-abi", + "libc", + "winapi", ] [[package]] -name = "proc-macro2" -version = "1.0.36" +name = "autocfg" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" dependencies = [ - "unicode-xid", + "autocfg 1.1.0", ] [[package]] -name = "quote" -version = "1.0.15" +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "base64ct" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b4d9b1225d28d360ec6a231d65af1fd99a2a095154c8040689617290569c5c" + +[[package]] +name = "bincode" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ - "proc-macro2", + "serde", ] [[package]] -name = "ryu" -version = "1.0.9" +name = "bitflags" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "serde" -version = "1.0.136" +name = "block-buffer" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ - "serde_derive", + "block-padding 0.1.5", + "byte-tools", + "byteorder", + "generic-array 0.12.4", ] [[package]] -name = "serde_derive" -version = "1.0.136" +name = "block-buffer" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "proc-macro2", - "quote", - "syn", + "block-padding 0.2.1", + "generic-array 0.14.5", ] [[package]] -name = "serde_yaml" -version = "0.8.23" +name = "block-padding" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" dependencies = [ - "indexmap", - "ryu", - "serde", - "yaml-rust", + "byte-tools", ] [[package]] -name = "strsim" -version = "0.8.0" +name = "block-padding" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] -name = "structopt" -version = "0.3.26" +name = "blocking" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +checksum = "c6ccb65d468978a086b69884437ded69a90faab3bbe6e67f242173ea728acccc" dependencies = [ - "clap", - "lazy_static", - "structopt-derive", + "async-channel", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", + "once_cell", ] [[package]] -name = "structopt-derive" -version = "0.4.18" +name = "bumpalo" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cache-padded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", + "generic-array 0.14.5", ] [[package]] -name = "syn" -version = "1.0.86" +name = "clap" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", ] [[package]] -name = "textwrap" -version = "0.11.0" +name = "concurrent-queue" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" dependencies = [ - "unicode-width", + "cache-padded", ] [[package]] -name = "unicode-segmentation" -version = "1.9.0" +name = "const-oid" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "9d6f2aa4d0537bcc1c74df8755072bd31c1ef1a3a1b85a68e8404a8c353b7b8b" [[package]] -name = "unicode-width" -version = "0.1.9" +name = "core-foundation" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "core-foundation-sys" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] -name = "vec_map" -version = "0.8.2" +name = "cpufeatures" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] [[package]] -name = "version_check" -version = "0.9.4" +name = "crossbeam-utils" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +dependencies = [ + "cfg-if", + "lazy_static", +] [[package]] -name = "winapi" -version = "0.3.9" +name = "crypto-bigint" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "f83bd3bb4314701c568e340cd8cf78c975aa0ca79e03d3f6d1677d5b0c9c0c03" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "generic-array 0.14.5", + "rand_core", + "subtle", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "crypto-mac" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.5", + "subtle", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "ctor" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" +dependencies = [ + "quote", + "syn", +] [[package]] -name = "yaml-rust" +name = "der" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +checksum = "79b71cca7d95d7681a4b3b9cdf63c8dbc3730d0584c2c74e31416d64a90493f4" dependencies = [ - "linked-hash-map", + "const-oid", + "crypto-bigint", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[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 = "dora-rs" +version = "0.1.0" +dependencies = [ + "async-std", + "env_logger", + "eyre", + "futures", + "pyo3", + "pyo3-asyncio", + "serde", + "serde_yaml", + "structopt", + "tokio", + "zenoh", +] + +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "event-listener" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" + +[[package]] +name = "eyre" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9289ed2c0440a6536e65119725cf91fc2c6b5e513bfd2e36e1134d7cca6ca12f" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "fixedbitset" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" + +[[package]] +name = "flume" +version = "0.10.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843c03199d0c0ca54bc1ea90ac0d507274c28abcc4f691ae8b4eaa375087c76a" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", + "spin 0.9.2", +] + +[[package]] +name = "futures" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-executor" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "ghost" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5bcf1bbeab73aa4cf2fde60a846858dc036163c7c33bec309f8d17de785479" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "git-version" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899" +dependencies = [ + "git-version-macro", + "proc-macro-hack", +] + +[[package]] +name = "git-version-macro" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "gloo-timers" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d12a7f4e95cfe710f1d624fb1210b7d961a5fb05c4fd942f4feab06e61f590e" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "home" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" +dependencies = [ + "winapi", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +dependencies = [ + "autocfg 1.1.0", + "hashbrown", +] + +[[package]] +name = "indoc" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7906a9fababaeacb774f72410e497a1d18de916322e33797bb2cd29baa23c9e" +dependencies = [ + "unindent", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "inventory" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6b5d8c669bfbad811d95ddd7a1c6cf9cfdbf2777e59928b6f3fa8ff54f72a0" +dependencies = [ + "ctor", + "ghost", +] + +[[package]] +name = "ipnetwork" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4088d739b183546b239688ddbc79891831df421773df95e236daf7867866d355" +dependencies = [ + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "js-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "keccak" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] + +[[package]] +name = "libc" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" + +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "lock_api" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", + "value-bag", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg 1.1.0", +] + +[[package]] +name = "mio" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "mio" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-bigint-dig" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4547ee5541c18742396ae2c895d0717d0f886d8823b8399cdaf7b07d63ad0480" +dependencies = [ + "autocfg 0.1.8", + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg 1.1.0", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +dependencies = [ + "autocfg 1.1.0", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg 1.1.0", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", +] + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.1", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "paste" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" + +[[package]] +name = "pem-rfc7468" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84e93a3b1cc0510b03020f33f21e62acdde3dcaef432edc95bea377fbd4c2cd4" +dependencies = [ + "base64ct", +] + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +dependencies = [ + "maplit", + "pest", + "sha-1", +] + +[[package]] +name = "petgraph" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "116bee8279d783c0cf370efa1a94632f2108e5ef0bb32df31f051647810a4e2c" +dependencies = [ + "der", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "pkcs8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447" +dependencies = [ + "der", + "pem-rfc7468", + "pkcs1", + "spki", + "zeroize", +] + +[[package]] +name = "pnet" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6d2a0409666964722368ef5fb74b9f93fac11c18bef3308693c16c6733f103" +dependencies = [ + "ipnetwork", + "pnet_base", + "pnet_datalink", + "pnet_packet", + "pnet_sys", + "pnet_transport", +] + +[[package]] +name = "pnet_base" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25488cd551a753dcaaa6fffc9f69a7610a412dd8954425bf7ffad5f7d1156fb8" + +[[package]] +name = "pnet_datalink" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d1f8ab1ef6c914cf51dc5dfe0be64088ea5f3b08bbf5a31abc70356d271198" +dependencies = [ + "ipnetwork", + "libc", + "pnet_base", + "pnet_sys", + "winapi", +] + +[[package]] +name = "pnet_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30490e0852e58402b8fae0d39897b08a24f493023a4d6cf56b2e30f31ed57548" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "pnet_macros_support" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4714e10f30cab023005adce048f2d30dd4ac4f093662abf2220855655ef8f90" +dependencies = [ + "pnet_base", +] + +[[package]] +name = "pnet_packet" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8588067671d03c9f4254b2e66fecb4d8b93b5d3e703195b84f311cd137e32130" +dependencies = [ + "glob", + "pnet_base", + "pnet_macros", + "pnet_macros_support", +] + +[[package]] +name = "pnet_sys" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9a3f32b0df45515befd19eed04616f6b56a488da92afc61164ef455e955f07f" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pnet_transport" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "932b2916d693bcc5fa18443dc99142e0a6fd31a6ce75a511868f7174c17e2bce" +dependencies = [ + "libc", + "pnet_base", + "pnet_packet", + "pnet_sys", +] + +[[package]] +name = "polling" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" +dependencies = [ + "cfg-if", + "libc", + "log", + "wepoll-ffi", + "winapi", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "pyo3" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a378727d5fdcaafd15b5afe9842cff1c25fdc43f62a162ffda2263c57ad98703" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "parking_lot 0.11.2", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-asyncio" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb097197d88c0d24df47fcf43c1f7eadde27b17a558cf8875123d60cee2cbba8" +dependencies = [ + "futures", + "inventory", + "once_cell", + "pin-project-lite", + "pyo3", + "pyo3-asyncio-macros", + "tokio", +] + +[[package]] +name = "pyo3-asyncio-macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6277334908799a4f9e705ae41496dd889dfbecfe32a846903746cd23b334a699" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pyo3-build-config" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fbb27a3e96edd34c13d97d0feefccc90a79270c577c66e19d95af8323823dfc" +dependencies = [ + "once_cell", +] + +[[package]] +name = "pyo3-ffi" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b719fff844bcf3f911132112ec06527eb195f6a98e0c42cf97e1118929fd4ea" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f795e52d3320abb349ca28b501a7112154a87f353fae1c811deecd58e99cfa9b" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e03aa57a3bb7b96982958088df38302a139df4eef54671bc595f26556cb75b" +dependencies = [ + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "quinn" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "584865613896a1f644d757e52c45c573441c8b04cac38ac13990b0235203db66" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "fxhash", + "quinn-proto", + "quinn-udp", + "rustls 0.20.4", + "thiserror", + "tokio", + "tracing", + "webpki 0.22.0", +] + +[[package]] +name = "quinn-proto" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b1562bf4998b0c6d1841a4742b7103bb82cdde61374833de826bab9e8ad498" +dependencies = [ + "bytes", + "fxhash", + "rand", + "ring", + "rustls 0.20.4", + "rustls-native-certs", + "rustls-pemfile 0.2.1", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki 0.22.0", +] + +[[package]] +name = "quinn-udp" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df185e5e5f7611fa6e628ed8f9633df10114b03bbaecab186ec55822c44ac727" +dependencies = [ + "futures-util", + "libc", + "mio 0.7.14", + "quinn-proto", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "quote" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rsa" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c2603e2823634ab331437001b411b9ed11660fbc4066f3908c84a9439260d" +dependencies = [ + "byteorder", + "digest 0.9.0", + "lazy_static", + "num-bigint-dig", + "num-integer", + "num-iter", + "num-traits", + "pkcs1", + "pkcs8", + "rand", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct 0.6.1", + "webpki 0.21.4", +] + +[[package]] +name = "rustls" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" +dependencies = [ + "log", + "ring", + "sct 0.7.0", + "webpki 0.22.0", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca9ebdfa27d3fc180e42879037b5338ab1c040c06affd00d8338598e7800943" +dependencies = [ + "openssl-probe", + "rustls-pemfile 0.2.1", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-pemfile" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" +dependencies = [ + "base64", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + +[[package]] +name = "sha-1" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug 0.3.0", +] + +[[package]] +name = "shared_memory" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681a9e90340f748af3a1cc52eb2c040eee29f976b763e99ad90fc0c5df6f9791" +dependencies = [ + "cfg-if", + "libc", + "nix 0.22.3", + "rand", + "winapi", +] + +[[package]] +name = "shellexpand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdb7831b2d85ddf4a7b148aa19d0587eddbe8671a436b7bd1182eaad0f2829" +dependencies = [ + "dirs-next", +] + +[[package]] +name = "signal-hook" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32" +dependencies = [ + "der", +] + +[[package]] +name = "stop-token" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af91f480ee899ab2d9f8435bfdfc14d08a5754bd9d3fef1f1a1c23336aad6c8b" +dependencies = [ + "async-channel", + "cfg-if", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinyvec" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio 0.8.2", + "num_cpus", + "once_cell", + "parking_lot 0.12.0", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "uhlc" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d74cc14aac0f650dae365e42250073bc0f89602bad5751d6159642be37690d6" +dependencies = [ + "hex", + "humantime", + "lazy_static", + "log", + "serde", + "uuid", +] + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "unindent" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514672a55d7380da379785a4d70ca8386c8883ff7eaae877be4d2081cebe73d8" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "unzip-n" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7e85a0596447f0f2ac090e16bc4c516c6fe91771fb0c0ccf7fa3dae896b9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "validated_struct" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85affc53ebb88700a36aefff74b6a4db38dbccf26ec777d40c9e9b471be261f8" +dependencies = [ + "json5", + "serde", + "serde_json", + "validated_struct_macros 0.1.10", +] + +[[package]] +name = "validated_struct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16daadad78d0a3aec2938c75864f3f57efed795bd9bb6b794fa2e3c3ffeffc3" +dependencies = [ + "json5", + "serde", + "serde_json", + "validated_struct_macros 1.0.0", +] + +[[package]] +name = "validated_struct_macros" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca689f3addec28c7d67ed3139498d0325253c71bf58ef57c2ba76141f7ce576f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unzip-n", +] + +[[package]] +name = "validated_struct_macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc2d772810cb61e997977e8d0b51c0344321692d2660e1aa2463dd745b4e803f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unzip-n", +] + +[[package]] +name = "value-bag" +version = "1.0.0-alpha.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79923f7731dc61ebfba3633098bf3ac533bbd35ccd8c57e7088d9a5eebe0263f" +dependencies = [ + "ctor", + "version_check", +] + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" + +[[package]] +name = "web-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "zenoh" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-global-executor", + "async-std", + "async-trait", + "base64", + "env_logger", + "event-listener", + "flume", + "futures", + "futures-lite", + "git-version", + "hex", + "lazy_static", + "log", + "ordered-float", + "petgraph", + "rand", + "regex", + "rustc_version", + "serde", + "serde_json", + "socket2", + "stop-token", + "uhlc", + "uuid", + "validated_struct 0.1.11", + "vec_map", + "zenoh-buffers", + "zenoh-cfg-properties", + "zenoh-collections", + "zenoh-config", + "zenoh-core", + "zenoh-crypto", + "zenoh-link", + "zenoh-plugin-trait", + "zenoh-protocol", + "zenoh-protocol-core", + "zenoh-sync", + "zenoh-transport", + "zenoh-util", +] + +[[package]] +name = "zenoh-buffers" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "bincode", + "hex", + "log", + "serde", + "shared_memory", + "zenoh-collections", + "zenoh-core", +] + +[[package]] +name = "zenoh-cfg-properties" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "zenoh-core", + "zenoh-macros", +] + +[[package]] +name = "zenoh-collections" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "async-trait", + "flume", + "log", + "zenoh-core", + "zenoh-sync", +] + +[[package]] +name = "zenoh-config" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "flume", + "json5", + "serde", + "serde_json", + "serde_yaml", + "validated_struct 1.0.0", + "zenoh-cfg-properties", + "zenoh-core", + "zenoh-protocol-core", + "zenoh-util", +] + +[[package]] +name = "zenoh-core" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "anyhow", + "lazy_static", +] + +[[package]] +name = "zenoh-crypto" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "aes", + "hmac", + "rand", + "rand_chacha", + "sha3", + "zenoh-core", +] + +[[package]] +name = "zenoh-link" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "async-trait", + "zenoh-cfg-properties", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-link-quic", + "zenoh-link-tcp", + "zenoh-link-tls", + "zenoh-link-udp", + "zenoh-link-unixsock_stream", + "zenoh-protocol-core", +] + +[[package]] +name = "zenoh-link-commons" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "async-trait", + "flume", + "zenoh-buffers", + "zenoh-cfg-properties", + "zenoh-core", + "zenoh-protocol", + "zenoh-protocol-core", +] + +[[package]] +name = "zenoh-link-quic" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "async-trait", + "log", + "quinn", + "rustls 0.20.4", + "rustls-native-certs", + "rustls-pemfile 0.3.0", + "webpki 0.22.0", + "zenoh-cfg-properties", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol-core", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-tcp" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "async-trait", + "log", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol-core", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-tls" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-rustls", + "async-std", + "async-trait", + "log", + "zenoh-cfg-properties", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol-core", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-udp" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "async-trait", + "log", + "socket2", + "zenoh-collections", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol-core", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-unixsock_stream" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "async-trait", + "log", + "nix 0.23.1", + "uuid", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol-core", + "zenoh-sync", +] + +[[package]] +name = "zenoh-macros" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn", + "unzip-n", +] + +[[package]] +name = "zenoh-plugin-trait" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "libloading", + "log", + "serde_json", + "zenoh-core", + "zenoh-macros", + "zenoh-util", +] + +[[package]] +name = "zenoh-protocol" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "log", + "uhlc", + "zenoh-buffers", + "zenoh-core", + "zenoh-protocol-core", +] + +[[package]] +name = "zenoh-protocol-core" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "hex", + "lazy_static", + "serde", + "uhlc", + "uuid", + "zenoh-core", +] + +[[package]] +name = "zenoh-sync" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "event-listener", + "flume", + "futures-lite", + "tokio", + "zenoh-core", +] + +[[package]] +name = "zenoh-transport" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-global-executor", + "async-std", + "async-trait", + "flume", + "log", + "paste", + "rand", + "rsa", + "serde", + "zenoh-buffers", + "zenoh-cfg-properties", + "zenoh-collections", + "zenoh-config", + "zenoh-core", + "zenoh-crypto", + "zenoh-link", + "zenoh-protocol", + "zenoh-protocol-core", + "zenoh-sync", +] + +[[package]] +name = "zenoh-util" +version = "0.6.0-dev.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +dependencies = [ + "async-std", + "clap", + "futures", + "hex", + "home", + "humantime", + "lazy_static", + "libc", + "libloading", + "log", + "pnet", + "shellexpand", + "winapi", + "zenoh-cfg-properties", + "zenoh-collections", + "zenoh-core", + "zenoh-crypto", + "zenoh-sync", +] + +[[package]] +name = "zeroize" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68d9dcec5f9b43a30d38c49f91dfedfaac384cb8f085faca366c26207dd1619" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index 7397579b..f6751181 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,10 +5,17 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[workspace] - [dependencies] eyre = "0.6.7" serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.8.23" structopt = "0.3.26" +async-std = { version = "1.10.0", default-features = false, features = [ + "attributes", +] } +zenoh = { git="https://github.com/eclipse-zenoh/zenoh.git" } +env_logger = "0.9.0" +tokio = { version="1.17.0", features=["full"]} +pyo3 = "0.16.1" +pyo3-asyncio = { version = "0.16", features = ["tokio-runtime", "attributes"] } +futures = "0.3.12" diff --git a/app.py b/app.py new file mode 100644 index 00000000..1e2a76ae --- /dev/null +++ b/app.py @@ -0,0 +1,3 @@ +async def return_1(x): + print(x) + return 1 diff --git a/src/lib.rs b/src/lib.rs index f0d46f32..0c24e539 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,2 @@ pub mod descriptor; +pub mod server; diff --git a/src/main.rs b/src/main.rs index 61b7d79f..01d429ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,28 +1,64 @@ -use dora_rs::descriptor::Descriptor; -use eyre::Context; +use dora_rs::{descriptor::Descriptor, server::start_server}; +use eyre::{Context, ContextCompat}; +use pyo3::prelude::*; use std::{fs::File, path::PathBuf}; use structopt::StructOpt; #[derive(Debug, Clone, StructOpt)] -struct Args { - file: PathBuf, +#[structopt(about = "Dora control")] +enum Command { + #[structopt(about = "Print Graph")] + Graph { file: PathBuf }, + #[structopt(about = "Print Runner")] + Runner { file: PathBuf }, + #[structopt(about = "Run Python server")] + StartPython { server: String }, } -fn main() -> eyre::Result<()> { - let args = Args::from_args(); - let descriptor_file = File::open(&args.file).context("failed to open given file")?; +#[pyo3_asyncio::tokio::main] +async fn main() -> PyResult<()> { + let command = Command::from_args(); + match command { + Command::Graph { file } => { + let descriptor_file = File::open(&file) + .context("failed to open given file") + .unwrap(); - let descriptor: Descriptor = - serde_yaml::from_reader(descriptor_file).context("failed to parse given descriptor")?; - - let visualized = descriptor - .visualize_as_mermaid() - .context("failed to visualize descriptor")?; - println!("{visualized}"); - println!( - "Paste the above output on https://mermaid.live/ or in a \ + let descriptor: Descriptor = serde_yaml::from_reader(descriptor_file) + .context("failed to parse given descriptor") + .unwrap(); + let visualized = descriptor + .visualize_as_mermaid() + .context("failed to visualize descriptor") + .unwrap(); + println!("{visualized}"); + println!( + "Paste the above output on https://mermaid.live/ or in a \ ```mermaid code block on GitHub to display it." - ); + ); + } + Command::Runner { file } => { + let descriptor_file = File::open(&file) + .context("failed to open given file") + .unwrap(); + + let descriptor: Descriptor = serde_yaml::from_reader(descriptor_file) + .context("failed to parse given descriptor") + .unwrap(); + let commands = descriptor + .print_commands() + .context("Failed to generate commands.") + .unwrap(); + println!("{commands}"); + } + Command::StartPython { server } => { + let mut server = server.split(":"); + let file = server.next().context("Server string is empty.").unwrap(); + let app = server.next().context("No app found").unwrap(); + + let _result = start_server(file, app).await; + } + } Ok(()) } diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 00000000..d9730524 --- /dev/null +++ b/src/server.rs @@ -0,0 +1,36 @@ +use futures::prelude::*; +use pyo3::prelude::*; +use zenoh::config::Config; +use zenoh::net::protocol::io::SplitBuffer; + +pub async fn start_server(file: &str, app: &str) -> eyre::Result<()> { + // Subscribe + env_logger::init(); + let config = Config::default(); + let session = zenoh::open(config).await.unwrap(); + let mut subscriber = session.subscribe("a").await.unwrap(); + let identity = initialize(file, app).await.unwrap(); + + loop { + let data = subscriber.next().await.unwrap().value.payload; + let binary = data.contiguous(); + println!("recieved data"); + + let result = Python::with_gil(|py| { + let a = (binary.into_py(py),); + pyo3_asyncio::tokio::into_future(identity.call(py, a, None).unwrap().as_ref(py)) + }) + .unwrap() + .await + .unwrap(); + } +} + +pub async fn initialize(file: &str, app: &str) -> PyResult> { + Ok(Python::with_gil(|py| { + let file = py.import(file).unwrap(); + // convert Function into a PyObject + let identity = file.getattr(app).unwrap(); + identity.to_object(py) + })) +} From bed3362a67ac705b4b99d8a281046a5c48b0088b Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Mon, 21 Mar 2022 13:56:51 +0100 Subject: [PATCH 02/13] Adding Python API design README --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 7e3e47b3..8e939cf0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,16 @@ # dora-rs Dataflow Oriented Robotic Architecture + +## Python API Design + +The Python API is probably going to look as follows: +```python +@register +async def function_name(state: DoraState, message: DoraMessage): + return outputs +``` + +The philosophy is to use async function as primary instance to: +- Mitigate the risk of running undafe data mutations. +- Managing several run at the same time with timeout / deadline capabilities +- Using Tokio Spawn to avoid thread locks on CPU bound runs. From 945715b4ffdd6816db91782f9fcaf87642909fda Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Mon, 21 Mar 2022 14:03:01 +0100 Subject: [PATCH 03/13] Adding example README --- .gitignore | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 14 +++++ src/main.rs | 16 ------ 3 files changed, 164 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index f2e972dd..4597a32f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,153 @@ # These are backup files generated by rustfmt **/*.rs.bk + + + + + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ diff --git a/README.md b/README.md index 8e939cf0..dca24c82 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,17 @@ The philosophy is to use async function as primary instance to: - Mitigate the risk of running undafe data mutations. - Managing several run at the same time with timeout / deadline capabilities - Using Tokio Spawn to avoid thread locks on CPU bound runs. + +## Getting started + +I have made a simple example that can be run with: +``` +cargo run start-server app:return_1 + +# Running this might required some shared library as: +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/miniconda3/lib +export PYTHONPATH=$PYTHONPATH:$(pwd) +``` +That is going to listen to the key_expr "a" and run the `return_1` function within the `app.py` python async. + +This is still very experimental. \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 01d429ff..0d7aa1b8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,8 +9,6 @@ use structopt::StructOpt; enum Command { #[structopt(about = "Print Graph")] Graph { file: PathBuf }, - #[structopt(about = "Print Runner")] - Runner { file: PathBuf }, #[structopt(about = "Run Python server")] StartPython { server: String }, } @@ -37,20 +35,6 @@ async fn main() -> PyResult<()> { ```mermaid code block on GitHub to display it." ); } - Command::Runner { file } => { - let descriptor_file = File::open(&file) - .context("failed to open given file") - .unwrap(); - - let descriptor: Descriptor = serde_yaml::from_reader(descriptor_file) - .context("failed to parse given descriptor") - .unwrap(); - let commands = descriptor - .print_commands() - .context("Failed to generate commands.") - .unwrap(); - println!("{commands}"); - } Command::StartPython { server } => { let mut server = server.split(":"); let file = server.next().context("Server string is empty.").unwrap(); From 5a9d2c146c25aecf7d9cbf77332f770c5231a36d Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Mon, 21 Mar 2022 15:48:24 +0100 Subject: [PATCH 04/13] Adding output stream --- app.py | 2 +- src/server.rs | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 1e2a76ae..25022b85 100644 --- a/app.py +++ b/app.py @@ -1,3 +1,3 @@ async def return_1(x): print(x) - return 1 + return {"b": "b", "c": "c"} diff --git a/src/server.rs b/src/server.rs index d9730524..20bfb935 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,5 +1,7 @@ use futures::prelude::*; use pyo3::prelude::*; +use std::collections::HashMap; +use std::env; use zenoh::config::Config; use zenoh::net::protocol::io::SplitBuffer; @@ -8,7 +10,10 @@ pub async fn start_server(file: &str, app: &str) -> eyre::Result<()> { env_logger::init(); let config = Config::default(); let session = zenoh::open(config).await.unwrap(); - let mut subscriber = session.subscribe("a").await.unwrap(); + let mut subscriber = session + .subscribe(env::var("SRC_LABELS").unwrap()) + .await + .unwrap(); let identity = initialize(file, app).await.unwrap(); loop { @@ -17,12 +22,17 @@ pub async fn start_server(file: &str, app: &str) -> eyre::Result<()> { println!("recieved data"); let result = Python::with_gil(|py| { - let a = (binary.into_py(py),); - pyo3_asyncio::tokio::into_future(identity.call(py, a, None).unwrap().as_ref(py)) + let args = (binary.into_py(py),); + pyo3_asyncio::tokio::into_future(identity.call(py, args, None).unwrap().as_ref(py)) }) .unwrap() .await .unwrap(); + + let outputs: HashMap = Python::with_gil(|py| result.extract(py)).unwrap(); + for (key, value) in outputs { + session.put(key, value).await.unwrap(); + } } } From 364333b8d075d28e1195964013848a93d58a9599 Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Tue, 22 Mar 2022 09:54:59 +0100 Subject: [PATCH 05/13] Fixing commentary --- Cargo.lock | 80 +++++++++++++++++---------------------------------- Cargo.toml | 3 -- README.md | 4 +-- src/main.rs | 14 +++++---- src/server.rs | 38 ++++++++++++++++++++---- 5 files changed, 69 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c634ade2..f035e31c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -511,7 +511,6 @@ dependencies = [ name = "dora-rs" version = "0.1.0" dependencies = [ - "async-std", "env_logger", "eyre", "futures", @@ -2309,45 +2308,21 @@ dependencies = [ [[package]] name = "validated_struct" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85affc53ebb88700a36aefff74b6a4db38dbccf26ec777d40c9e9b471be261f8" -dependencies = [ - "json5", - "serde", - "serde_json", - "validated_struct_macros 0.1.10", -] - -[[package]] -name = "validated_struct" -version = "1.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16daadad78d0a3aec2938c75864f3f57efed795bd9bb6b794fa2e3c3ffeffc3" +checksum = "feef04c049b4beae3037a2a31b8da40d8cebec0b97456f24c7de0ede4ed9efed" dependencies = [ "json5", "serde", "serde_json", - "validated_struct_macros 1.0.0", + "validated_struct_macros", ] [[package]] name = "validated_struct_macros" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca689f3addec28c7d67ed3139498d0325253c71bf58ef57c2ba76141f7ce576f" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unzip-n", -] - -[[package]] -name = "validated_struct_macros" -version = "1.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2d772810cb61e997977e8d0b51c0344321692d2660e1aa2463dd745b4e803f" +checksum = "9d4444a980afa9ef0d29c2a3f4d952ec0495a7a996a9c78b52698b71bc21edb4" dependencies = [ "proc-macro2", "quote", @@ -2586,7 +2561,7 @@ dependencies = [ [[package]] name = "zenoh" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-global-executor", "async-std", @@ -2612,7 +2587,6 @@ dependencies = [ "stop-token", "uhlc", "uuid", - "validated_struct 0.1.11", "vec_map", "zenoh-buffers", "zenoh-cfg-properties", @@ -2632,7 +2606,7 @@ dependencies = [ [[package]] name = "zenoh-buffers" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "bincode", @@ -2647,7 +2621,7 @@ dependencies = [ [[package]] name = "zenoh-cfg-properties" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "zenoh-core", "zenoh-macros", @@ -2656,7 +2630,7 @@ dependencies = [ [[package]] name = "zenoh-collections" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "async-trait", @@ -2669,14 +2643,14 @@ dependencies = [ [[package]] name = "zenoh-config" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "flume", "json5", "serde", "serde_json", "serde_yaml", - "validated_struct 1.0.0", + "validated_struct", "zenoh-cfg-properties", "zenoh-core", "zenoh-protocol-core", @@ -2686,7 +2660,7 @@ dependencies = [ [[package]] name = "zenoh-core" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "anyhow", "lazy_static", @@ -2695,7 +2669,7 @@ dependencies = [ [[package]] name = "zenoh-crypto" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "aes", "hmac", @@ -2708,7 +2682,7 @@ dependencies = [ [[package]] name = "zenoh-link" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "async-trait", @@ -2727,7 +2701,7 @@ dependencies = [ [[package]] name = "zenoh-link-commons" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "async-trait", @@ -2742,7 +2716,7 @@ dependencies = [ [[package]] name = "zenoh-link-quic" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "async-trait", @@ -2764,7 +2738,7 @@ dependencies = [ [[package]] name = "zenoh-link-tcp" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "async-trait", @@ -2779,7 +2753,7 @@ dependencies = [ [[package]] name = "zenoh-link-tls" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-rustls", "async-std", @@ -2797,7 +2771,7 @@ dependencies = [ [[package]] name = "zenoh-link-udp" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "async-trait", @@ -2814,7 +2788,7 @@ dependencies = [ [[package]] name = "zenoh-link-unixsock_stream" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "async-trait", @@ -2830,7 +2804,7 @@ dependencies = [ [[package]] name = "zenoh-macros" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "proc-macro2", "quote", @@ -2842,7 +2816,7 @@ dependencies = [ [[package]] name = "zenoh-plugin-trait" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "libloading", "log", @@ -2855,7 +2829,7 @@ dependencies = [ [[package]] name = "zenoh-protocol" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "log", "uhlc", @@ -2867,7 +2841,7 @@ dependencies = [ [[package]] name = "zenoh-protocol-core" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "hex", "lazy_static", @@ -2880,7 +2854,7 @@ dependencies = [ [[package]] name = "zenoh-sync" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "event-listener", @@ -2893,7 +2867,7 @@ dependencies = [ [[package]] name = "zenoh-transport" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-global-executor", "async-std", @@ -2919,7 +2893,7 @@ dependencies = [ [[package]] name = "zenoh-util" version = "0.6.0-dev.0" -source = "git+https://github.com/eclipse-zenoh/zenoh.git#71228023fbec3e6051160f05165ec2ef66338545" +source = "git+https://github.com/eclipse-zenoh/zenoh.git#43666dd04433a5836f0cbadb610ca23a58d7ed3d" dependencies = [ "async-std", "clap", diff --git a/Cargo.toml b/Cargo.toml index f6751181..9c487bbc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,9 +10,6 @@ eyre = "0.6.7" serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.8.23" structopt = "0.3.26" -async-std = { version = "1.10.0", default-features = false, features = [ - "attributes", -] } zenoh = { git="https://github.com/eclipse-zenoh/zenoh.git" } env_logger = "0.9.0" tokio = { version="1.17.0", features=["full"]} diff --git a/README.md b/README.md index dca24c82..484fa8b3 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ async def function_name(state: DoraState, message: DoraMessage): ``` The philosophy is to use async function as primary instance to: -- Mitigate the risk of running undafe data mutations. +- Mitigate the risk of running unsafe data mutations. - Managing several run at the same time with timeout / deadline capabilities - Using Tokio Spawn to avoid thread locks on CPU bound runs. @@ -19,7 +19,7 @@ The philosophy is to use async function as primary instance to: I have made a simple example that can be run with: ``` -cargo run start-server app:return_1 +cargo run start-python app:return_1 # Running this might required some shared library as: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/miniconda3/lib diff --git a/src/main.rs b/src/main.rs index 0d7aa1b8..ff2eed02 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use dora_rs::{descriptor::Descriptor, server::start_server}; -use eyre::{Context, ContextCompat}; -use pyo3::prelude::*; +use eyre::{Context, ContextCompat, Result}; +use pyo3::{prelude::*, prepare_freethreaded_python}; use std::{fs::File, path::PathBuf}; use structopt::StructOpt; @@ -13,8 +13,7 @@ enum Command { StartPython { server: String }, } -#[pyo3_asyncio::tokio::main] -async fn main() -> PyResult<()> { +fn main() -> Result<()> { let command = Command::from_args(); match command { Command::Graph { file } => { @@ -39,8 +38,11 @@ async fn main() -> PyResult<()> { let mut server = server.split(":"); let file = server.next().context("Server string is empty.").unwrap(); let app = server.next().context("No app found").unwrap(); - - let _result = start_server(file, app).await; + let rt = tokio::runtime::Runtime::new().unwrap(); + prepare_freethreaded_python(); + rt.block_on(async { + let _result = start_server(file, app).await; + }); } } diff --git a/src/server.rs b/src/server.rs index 20bfb935..0ddde00e 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,3 +1,4 @@ +use eyre::{eyre, Context}; use futures::prelude::*; use pyo3::prelude::*; use std::collections::HashMap; @@ -13,6 +14,9 @@ pub async fn start_server(file: &str, app: &str) -> eyre::Result<()> { let mut subscriber = session .subscribe(env::var("SRC_LABELS").unwrap()) .await + .map_err(|err| { + eyre!("Could not subscribe to the given subscription key expression. Error: {err}") + }) .unwrap(); let identity = initialize(file, app).await.unwrap(); @@ -23,24 +27,46 @@ pub async fn start_server(file: &str, app: &str) -> eyre::Result<()> { let result = Python::with_gil(|py| { let args = (binary.into_py(py),); - pyo3_asyncio::tokio::into_future(identity.call(py, args, None).unwrap().as_ref(py)) + pyo3_asyncio::tokio::into_future( + identity + .call(py, args, None) + .wrap_err("The Python function call did not succeed.") + .unwrap() + .as_ref(py), + ) }) + .wrap_err("Could not create future of python function call.") .unwrap() .await + .wrap_err("Could not await the python future.") .unwrap(); - let outputs: HashMap = Python::with_gil(|py| result.extract(py)).unwrap(); + let outputs: HashMap = Python::with_gil(|py| result.extract(py)) + .wrap_err("Could not retrieve the python result.") + .unwrap(); for (key, value) in outputs { - session.put(key, value).await.unwrap(); + session + .put(key, value) + .await + .map_err(|err| { + eyre!("Could not put the output within the chosen key expression topic. Error: {err}") + }) + .unwrap(); } } } -pub async fn initialize(file: &str, app: &str) -> PyResult> { +pub async fn initialize(file: &str, app: &str) -> eyre::Result> { Ok(Python::with_gil(|py| { - let file = py.import(file).unwrap(); + let file = py + .import(file) + .wrap_err("The import file was not found. Check your PYTHONPATH env variable.") + .unwrap(); // convert Function into a PyObject - let identity = file.getattr(app).unwrap(); + let identity = file + .getattr(app) + .wrap_err("The Function was not found in the imported file.") + .unwrap(); identity.to_object(py) })) } From 7b4408ec882f412acaf88fafcae71222ec5982af Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Tue, 22 Mar 2022 13:54:04 +0100 Subject: [PATCH 06/13] Reintroducing the pyo3 async tokio derive main Pyo3 async only work with a main derived from the proc macro pyo3 asyncio main. If this is removed Python async call does not work. --- app.py | 3 +++ src/main.rs | 19 ++++++-------- src/server.rs | 69 +++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 63 insertions(+), 28 deletions(-) diff --git a/app.py b/app.py index 25022b85..fd627d05 100644 --- a/app.py +++ b/app.py @@ -1,3 +1,6 @@ +import asyncio + + async def return_1(x): print(x) return {"b": "b", "c": "c"} diff --git a/src/main.rs b/src/main.rs index ff2eed02..a78cb422 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ -use dora_rs::{descriptor::Descriptor, server::start_server}; -use eyre::{Context, ContextCompat, Result}; -use pyo3::{prelude::*, prepare_freethreaded_python}; +use dora_rs::descriptor::Descriptor; +use eyre::{Context, Result}; +use pyo3::prepare_freethreaded_python; use std::{fs::File, path::PathBuf}; use structopt::StructOpt; @@ -10,7 +10,7 @@ enum Command { #[structopt(about = "Print Graph")] Graph { file: PathBuf }, #[structopt(about = "Run Python server")] - StartPython { server: String }, + StartPython, } fn main() -> Result<()> { @@ -34,15 +34,10 @@ fn main() -> Result<()> { ```mermaid code block on GitHub to display it." ); } - Command::StartPython { server } => { - let mut server = server.split(":"); - let file = server.next().context("Server string is empty.").unwrap(); - let app = server.next().context("No app found").unwrap(); - let rt = tokio::runtime::Runtime::new().unwrap(); + Command::StartPython => { prepare_freethreaded_python(); - rt.block_on(async { - let _result = start_server(file, app).await; - }); + + dora_rs::server::main(); } } diff --git a/src/server.rs b/src/server.rs index 0ddde00e..0f469c36 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,32 +1,69 @@ use eyre::{eyre, Context}; use futures::prelude::*; use pyo3::prelude::*; -use std::collections::HashMap; +use std::collections::hash_map::DefaultHasher; +use std::collections::{BTreeMap, HashMap}; use std::env; +use std::hash::Hash; +use std::hash::Hasher; +use std::time::Duration; +use tokio::time::timeout; use zenoh::config::Config; -use zenoh::net::protocol::io::SplitBuffer; +use zenoh::prelude::SplitBuffer; +static DURATION_MILLIS: u64 = 5; -pub async fn start_server(file: &str, app: &str) -> eyre::Result<()> { +#[pyo3_asyncio::tokio::main] +pub async fn main() -> PyResult<()> { // Subscribe env_logger::init(); let config = Config::default(); let session = zenoh::open(config).await.unwrap(); - let mut subscriber = session - .subscribe(env::var("SRC_LABELS").unwrap()) - .await - .map_err(|err| { - eyre!("Could not subscribe to the given subscription key expression. Error: {err}") - }) + let subscriptions = env::var("SRC_LABELS") + .wrap_err("Env variable not set") .unwrap(); - let identity = initialize(file, app).await.unwrap(); + let subscriptions = subscriptions.split(":"); + + let mut subscribers = HashMap::new(); + + for subscription in subscriptions { + subscribers.insert(subscription, session + .subscribe(subscription) + .await + .map_err(|err| { + eyre!("Could not subscribe to the given subscription key expression. Error: {err}") + }) + .unwrap()); + } + + let mut states = BTreeMap::new(); + let mut hasher = DefaultHasher::new(); + states.hash(&mut hasher); + let mut state_hash = hasher.finish(); + + let identity = initialize("app".to_string(), "return_1".to_string()).unwrap(); + let dur = Duration::from_millis(DURATION_MILLIS); loop { - let data = subscriber.next().await.unwrap().value.payload; - let binary = data.contiguous(); - println!("recieved data"); + for (subscription, subscriber) in subscribers.iter_mut() { + let result = timeout(dur, subscriber.next()).await; + if let Ok(Some(data)) = result { + let value = data.value.payload; + let binary = value.contiguous(); + states.insert(subscription.clone(), binary.to_vec()); + } + } + + let mut hasher = DefaultHasher::new(); + states.hash(&mut hasher); + + if state_hash == hasher.finish() { + continue; + } else { + state_hash = hasher.finish(); + } let result = Python::with_gil(|py| { - let args = (binary.into_py(py),); + let args = (states.clone().into_py(py),); pyo3_asyncio::tokio::into_future( identity .call(py, args, None) @@ -56,10 +93,10 @@ pub async fn start_server(file: &str, app: &str) -> eyre::Result<()> { } } -pub async fn initialize(file: &str, app: &str) -> eyre::Result> { +pub fn initialize(file: String, app: String) -> eyre::Result> { Ok(Python::with_gil(|py| { let file = py - .import(file) + .import(&file) .wrap_err("The import file was not found. Check your PYTHONPATH env variable.") .unwrap(); // convert Function into a PyObject From 1abcd33abc633aedacbfc6c3c0f8235bae28d880 Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Tue, 22 Mar 2022 16:24:55 +0100 Subject: [PATCH 07/13] Adding State management --- Cargo.lock | 10 +++++++ Cargo.toml | 1 + src/server.rs | 72 ++++++++++++++++++++++++++++++++------------------- 3 files changed, 57 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f035e31c..a39587d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -512,6 +512,7 @@ name = "dora-rs" version = "0.1.0" dependencies = [ "env_logger", + "envy", "eyre", "futures", "pyo3", @@ -536,6 +537,15 @@ dependencies = [ "termcolor", ] +[[package]] +name = "envy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965" +dependencies = [ + "serde", +] + [[package]] name = "event-listener" version = "2.5.2" diff --git a/Cargo.toml b/Cargo.toml index 9c487bbc..fd206673 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,4 @@ tokio = { version="1.17.0", features=["full"]} pyo3 = "0.16.1" pyo3-asyncio = { version = "0.16", features = ["tokio-runtime", "attributes"] } futures = "0.3.12" +envy = "0.4.2" \ No newline at end of file diff --git a/src/server.rs b/src/server.rs index 0f469c36..3e857752 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,32 +1,41 @@ use eyre::{eyre, Context}; -use futures::prelude::*; +use futures::future::join_all; +use futures::stream::Next; +use futures::{join, prelude::*}; use pyo3::prelude::*; use std::collections::hash_map::DefaultHasher; use std::collections::{BTreeMap, HashMap}; -use std::env; use std::hash::Hash; use std::hash::Hasher; -use std::time::Duration; +use std::time::{Duration, Instant}; use tokio::time::timeout; use zenoh::config::Config; use zenoh::prelude::SplitBuffer; -static DURATION_MILLIS: u64 = 5; +static DURATION_MILLIS: u64 = 1; +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +struct ConfigVariables { + subscriptions: Vec, + app: String, + function: String, +} #[pyo3_asyncio::tokio::main] pub async fn main() -> PyResult<()> { // Subscribe + let variables = envy::from_env::().unwrap(); + env_logger::init(); let config = Config::default(); let session = zenoh::open(config).await.unwrap(); - let subscriptions = env::var("SRC_LABELS") - .wrap_err("Env variable not set") - .unwrap(); - let subscriptions = subscriptions.split(":"); + // Create a hashmap of all subscriptions. let mut subscribers = HashMap::new(); + let subs = variables.subscriptions.clone(); - for subscription in subscriptions { - subscribers.insert(subscription, session + for subscription in &subs { + subscribers.insert(subscription.clone(), session .subscribe(subscription) .await .map_err(|err| { @@ -35,37 +44,47 @@ pub async fn main() -> PyResult<()> { .unwrap()); } + // Store the latest value of all subscription as well as the output of the function. hash the state to easily check if the state has changed. let mut states = BTreeMap::new(); let mut hasher = DefaultHasher::new(); states.hash(&mut hasher); let mut state_hash = hasher.finish(); - let identity = initialize("app".to_string(), "return_1".to_string()).unwrap(); + let py_function = initialize(variables.app, variables.function).unwrap(); let dur = Duration::from_millis(DURATION_MILLIS); + let mut futures_put = vec![]; loop { - for (subscription, subscriber) in subscribers.iter_mut() { - let result = timeout(dur, subscriber.next()).await; + let now = Instant::now(); + let mut futures = vec![]; + for (_, v) in subscribers.iter_mut() { + futures.push(timeout(dur, v.next())); + } + + let results = join_all(futures).await; + + for (result, subscription) in results.into_iter().zip(&subs) { if let Ok(Some(data)) = result { let value = data.value.payload; let binary = value.contiguous(); - states.insert(subscription.clone(), binary.to_vec()); + states.insert( + subscription.clone().to_string(), + String::from_utf8(binary.to_vec()).unwrap(), + ); } } let mut hasher = DefaultHasher::new(); states.hash(&mut hasher); - - if state_hash == hasher.finish() { + let new_hash = hasher.finish(); + if state_hash == new_hash { continue; - } else { - state_hash = hasher.finish(); } let result = Python::with_gil(|py| { let args = (states.clone().into_py(py),); pyo3_asyncio::tokio::into_future( - identity + py_function .call(py, args, None) .wrap_err("The Python function call did not succeed.") .unwrap() @@ -81,15 +100,16 @@ pub async fn main() -> PyResult<()> { let outputs: HashMap = Python::with_gil(|py| result.extract(py)) .wrap_err("Could not retrieve the python result.") .unwrap(); + for (key, value) in outputs { - session - .put(key, value) - .await - .map_err(|err| { - eyre!("Could not put the output within the chosen key expression topic. Error: {err}") - }) - .unwrap(); + states.insert(key.clone(), value.clone()); + futures_put.push(timeout(dur, session.put(key, value))); } + + let mut hasher = DefaultHasher::new(); + states.hash(&mut hasher); + state_hash = hasher.finish(); + println!("loop {:#?}", now.elapsed()); } } From 81f5a891c46b621ae87b79c8d77e27614fa2c8f6 Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Tue, 22 Mar 2022 18:30:25 +0100 Subject: [PATCH 08/13] Refactoring the code --- app.py | 5 +++ src/lib.rs | 1 + src/python_binding.rs | 48 ++++++++++++++++++++++++++ src/server.rs | 79 ++++++++++++++----------------------------- 4 files changed, 80 insertions(+), 53 deletions(-) create mode 100644 src/python_binding.rs diff --git a/app.py b/app.py index fd627d05..be2eaf1a 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,11 @@ import asyncio +counter = 0 + async def return_1(x): + global counter + counter += 1 + print(counter) print(x) return {"b": "b", "c": "c"} diff --git a/src/lib.rs b/src/lib.rs index 0c24e539..f14aea1e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod descriptor; +pub mod python_binding; pub mod server; diff --git a/src/python_binding.rs b/src/python_binding.rs new file mode 100644 index 00000000..ecaa1c59 --- /dev/null +++ b/src/python_binding.rs @@ -0,0 +1,48 @@ +use eyre::{eyre, Context}; +use pyo3::prelude::*; +use serde::Deserialize; +use std::collections::{BTreeMap, HashMap}; + +#[derive(Deserialize, Debug)] +struct PythonVariables { + app: String, + function: String, +} + +pub fn init() -> eyre::Result> { + let variables = envy::from_env::().unwrap(); + Ok(Python::with_gil(|py| { + let file = py + .import(&variables.app) + .wrap_err("The import file was not found. Check your PYTHONPATH env variable.") + .unwrap(); + // convert Function into a PyObject + let identity = file + .getattr(variables.function) + .wrap_err("The Function was not found in the imported file.") + .unwrap(); + identity.to_object(py) + })) +} + +pub async fn call( + py_function: &PyObject, + states: BTreeMap, +) -> eyre::Result> { + let result = Python::with_gil(|py| { + let args = (states.clone().into_py(py),); + pyo3_asyncio::tokio::into_future( + py_function + .call(py, args, None) + .wrap_err("The Python function call did not succeed.") + .unwrap() + .as_ref(py), + ) + }) + .wrap_err("Could not create future of python function call.") + .unwrap() + .await + .wrap_err("Could not await the python future.") + .unwrap(); + Python::with_gil(|py| result.extract(py)).wrap_err("Could not retrieve the python result.") +} diff --git a/src/server.rs b/src/server.rs index 3e857752..cb773caa 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,8 +1,9 @@ -use eyre::{eyre, Context}; +use eyre::eyre; +use eyre::WrapErr; use futures::future::join_all; -use futures::stream::Next; -use futures::{join, prelude::*}; +use futures::prelude::*; use pyo3::prelude::*; +use serde::Deserialize; use std::collections::hash_map::DefaultHasher; use std::collections::{BTreeMap, HashMap}; use std::hash::Hash; @@ -11,14 +12,13 @@ use std::time::{Duration, Instant}; use tokio::time::timeout; use zenoh::config::Config; use zenoh::prelude::SplitBuffer; -static DURATION_MILLIS: u64 = 1; -use serde::Deserialize; +use crate::python_binding::{call, init}; + +static DURATION_MILLIS: u64 = 1; #[derive(Deserialize, Debug)] struct ConfigVariables { subscriptions: Vec, - app: String, - function: String, } #[pyo3_asyncio::tokio::main] @@ -46,19 +46,19 @@ pub async fn main() -> PyResult<()> { // Store the latest value of all subscription as well as the output of the function. hash the state to easily check if the state has changed. let mut states = BTreeMap::new(); - let mut hasher = DefaultHasher::new(); - states.hash(&mut hasher); - let mut state_hash = hasher.finish(); + let mut states_hash = hash(&states); - let py_function = initialize(variables.app, variables.function).unwrap(); - let dur = Duration::from_millis(DURATION_MILLIS); + let py_function = init() + .wrap_err("Failed to init the Python Function") + .unwrap(); + let duration = Duration::from_millis(DURATION_MILLIS); let mut futures_put = vec![]; loop { let now = Instant::now(); let mut futures = vec![]; for (_, v) in subscribers.iter_mut() { - futures.push(timeout(dur, v.next())); + futures.push(timeout(duration, v.next())); } let results = join_all(futures).await; @@ -74,56 +74,29 @@ pub async fn main() -> PyResult<()> { } } - let mut hasher = DefaultHasher::new(); - states.hash(&mut hasher); - let new_hash = hasher.finish(); - if state_hash == new_hash { + let new_hash = hash(&states); + + if states_hash == new_hash { continue; } - let result = Python::with_gil(|py| { - let args = (states.clone().into_py(py),); - pyo3_asyncio::tokio::into_future( - py_function - .call(py, args, None) - .wrap_err("The Python function call did not succeed.") - .unwrap() - .as_ref(py), - ) - }) - .wrap_err("Could not create future of python function call.") - .unwrap() - .await - .wrap_err("Could not await the python future.") - .unwrap(); - - let outputs: HashMap = Python::with_gil(|py| result.extract(py)) - .wrap_err("Could not retrieve the python result.") - .unwrap(); + let now = Instant::now(); + let outputs = call(&py_function, states.clone()).await.unwrap(); + println!("call python {:#?}", now.elapsed()); for (key, value) in outputs { states.insert(key.clone(), value.clone()); - futures_put.push(timeout(dur, session.put(key, value))); + futures_put.push(session.put(key, value)); } - let mut hasher = DefaultHasher::new(); - states.hash(&mut hasher); - state_hash = hasher.finish(); + states_hash = hash(&states); + println!("loop {:#?}", now.elapsed()); } } -pub fn initialize(file: String, app: String) -> eyre::Result> { - Ok(Python::with_gil(|py| { - let file = py - .import(&file) - .wrap_err("The import file was not found. Check your PYTHONPATH env variable.") - .unwrap(); - // convert Function into a PyObject - let identity = file - .getattr(app) - .wrap_err("The Function was not found in the imported file.") - .unwrap(); - identity.to_object(py) - })) +fn hash(states: &BTreeMap) -> u64 { + let mut hasher = DefaultHasher::new(); + states.hash(&mut hasher); + hasher.finish() } From 113626475527bfe0d7b1c0dfbdcf5c7bc1355f9a Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Wed, 23 Mar 2022 11:13:54 +0100 Subject: [PATCH 09/13] Removing asyncio --- app.py | 6 ++++-- src/python_binding.rs | 21 +++++++-------------- src/server.rs | 6 +++--- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/app.py b/app.py index be2eaf1a..6535b44f 100644 --- a/app.py +++ b/app.py @@ -2,10 +2,12 @@ import asyncio counter = 0 +import logging -async def return_1(x): + +def return_1(x): global counter counter += 1 print(counter) - print(x) + logging.info(x) return {"b": "b", "c": "c"} diff --git a/src/python_binding.rs b/src/python_binding.rs index ecaa1c59..9be8d0ff 100644 --- a/src/python_binding.rs +++ b/src/python_binding.rs @@ -29,20 +29,13 @@ pub async fn call( py_function: &PyObject, states: BTreeMap, ) -> eyre::Result> { - let result = Python::with_gil(|py| { + Python::with_gil(|py| { let args = (states.clone().into_py(py),); - pyo3_asyncio::tokio::into_future( - py_function - .call(py, args, None) - .wrap_err("The Python function call did not succeed.") - .unwrap() - .as_ref(py), - ) + let result = py_function + .call(py, args, None) + .wrap_err("The Python function call did not succeed.") + .unwrap(); + result.extract(py) }) - .wrap_err("Could not create future of python function call.") - .unwrap() - .await - .wrap_err("Could not await the python future.") - .unwrap(); - Python::with_gil(|py| result.extract(py)).wrap_err("Could not retrieve the python result.") + .wrap_err("") } diff --git a/src/server.rs b/src/server.rs index cb773caa..6faa98dc 100644 --- a/src/server.rs +++ b/src/server.rs @@ -15,13 +15,13 @@ use zenoh::prelude::SplitBuffer; use crate::python_binding::{call, init}; -static DURATION_MILLIS: u64 = 1; +static DURATION_MILLIS: u64 = 5; #[derive(Deserialize, Debug)] struct ConfigVariables { subscriptions: Vec, } -#[pyo3_asyncio::tokio::main] +#[tokio::main] pub async fn main() -> PyResult<()> { // Subscribe let variables = envy::from_env::().unwrap(); @@ -81,6 +81,7 @@ pub async fn main() -> PyResult<()> { } let now = Instant::now(); + let outputs = call(&py_function, states.clone()).await.unwrap(); println!("call python {:#?}", now.elapsed()); @@ -90,7 +91,6 @@ pub async fn main() -> PyResult<()> { } states_hash = hash(&states); - println!("loop {:#?}", now.elapsed()); } } From 27371cbd720ac316f27a127691b316845cc09a53 Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Wed, 23 Mar 2022 11:14:35 +0100 Subject: [PATCH 10/13] Removing asyncio from cargo --- Cargo.lock | 48 ------------------------------------------------ Cargo.toml | 1 - 2 files changed, 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a39587d7..96ae2434 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -516,7 +516,6 @@ dependencies = [ "eyre", "futures", "pyo3", - "pyo3-asyncio", "serde", "serde_yaml", "structopt", @@ -741,17 +740,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "ghost" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5bcf1bbeab73aa4cf2fde60a846858dc036163c7c33bec309f8d17de785479" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "git-version" version = "0.3.5" @@ -881,16 +869,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "inventory" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6b5d8c669bfbad811d95ddd7a1c6cf9cfdbf2777e59928b6f3fa8ff54f72a0" -dependencies = [ - "ctor", - "ghost", -] - [[package]] name = "ipnetwork" version = "0.18.0" @@ -1530,32 +1508,6 @@ dependencies = [ "unindent", ] -[[package]] -name = "pyo3-asyncio" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb097197d88c0d24df47fcf43c1f7eadde27b17a558cf8875123d60cee2cbba8" -dependencies = [ - "futures", - "inventory", - "once_cell", - "pin-project-lite", - "pyo3", - "pyo3-asyncio-macros", - "tokio", -] - -[[package]] -name = "pyo3-asyncio-macros" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6277334908799a4f9e705ae41496dd889dfbecfe32a846903746cd23b334a699" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "pyo3-build-config" version = "0.16.2" diff --git a/Cargo.toml b/Cargo.toml index fd206673..d3c42e4b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,5 @@ zenoh = { git="https://github.com/eclipse-zenoh/zenoh.git" } env_logger = "0.9.0" tokio = { version="1.17.0", features=["full"]} pyo3 = "0.16.1" -pyo3-asyncio = { version = "0.16", features = ["tokio-runtime", "attributes"] } futures = "0.3.12" envy = "0.4.2" \ No newline at end of file From 80291e9ef4d4d35d3a9ff35af4a0cfc35611f66f Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 23 Mar 2022 11:32:49 +0100 Subject: [PATCH 11/13] Pass python server args via command line + other restructurings --- src/lib.rs | 3 +- src/main.rs | 25 ++++++--------- src/{python_binding.rs => python/binding.rs} | 17 +++-------- src/python/mod.rs | 2 ++ src/{ => python}/server.rs | 32 +++++++++----------- 5 files changed, 32 insertions(+), 47 deletions(-) rename src/{python_binding.rs => python/binding.rs} (72%) create mode 100644 src/python/mod.rs rename src/{ => python}/server.rs (78%) diff --git a/src/lib.rs b/src/lib.rs index f14aea1e..76efc867 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,2 @@ pub mod descriptor; -pub mod python_binding; -pub mod server; +pub mod python; diff --git a/src/main.rs b/src/main.rs index a78cb422..93097efb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ use dora_rs::descriptor::Descriptor; -use eyre::{Context, Result}; -use pyo3::prepare_freethreaded_python; +use eyre::Context; use std::{fs::File, path::PathBuf}; use structopt::StructOpt; @@ -10,34 +9,30 @@ enum Command { #[structopt(about = "Print Graph")] Graph { file: PathBuf }, #[structopt(about = "Run Python server")] - StartPython, + StartPython(dora_rs::python::server::PythonCommand), } -fn main() -> Result<()> { +fn main() -> eyre::Result<()> { + env_logger::init(); + let command = Command::from_args(); match command { Command::Graph { file } => { - let descriptor_file = File::open(&file) - .context("failed to open given file") - .unwrap(); + let descriptor_file = File::open(&file).context("failed to open given file")?; let descriptor: Descriptor = serde_yaml::from_reader(descriptor_file) - .context("failed to parse given descriptor") - .unwrap(); + .context("failed to parse given descriptor")?; let visualized = descriptor .visualize_as_mermaid() - .context("failed to visualize descriptor") - .unwrap(); + .context("failed to visualize descriptor")?; println!("{visualized}"); println!( "Paste the above output on https://mermaid.live/ or in a \ ```mermaid code block on GitHub to display it." ); } - Command::StartPython => { - prepare_freethreaded_python(); - - dora_rs::server::main(); + Command::StartPython(command) => { + dora_rs::python::server::run(command).context("python server failed")?; } } diff --git a/src/python_binding.rs b/src/python/binding.rs similarity index 72% rename from src/python_binding.rs rename to src/python/binding.rs index 9be8d0ff..f1f7f373 100644 --- a/src/python_binding.rs +++ b/src/python/binding.rs @@ -1,24 +1,17 @@ -use eyre::{eyre, Context}; +use eyre::Context; use pyo3::prelude::*; -use serde::Deserialize; use std::collections::{BTreeMap, HashMap}; -#[derive(Deserialize, Debug)] -struct PythonVariables { - app: String, - function: String, -} - -pub fn init() -> eyre::Result> { - let variables = envy::from_env::().unwrap(); +pub fn init(app: &str, function: &str) -> eyre::Result> { + pyo3::prepare_freethreaded_python(); Ok(Python::with_gil(|py| { let file = py - .import(&variables.app) + .import(app) .wrap_err("The import file was not found. Check your PYTHONPATH env variable.") .unwrap(); // convert Function into a PyObject let identity = file - .getattr(variables.function) + .getattr(function) .wrap_err("The Function was not found in the imported file.") .unwrap(); identity.to_object(py) diff --git a/src/python/mod.rs b/src/python/mod.rs new file mode 100644 index 00000000..06dcd6cf --- /dev/null +++ b/src/python/mod.rs @@ -0,0 +1,2 @@ +pub mod binding; +pub mod server; diff --git a/src/server.rs b/src/python/server.rs similarity index 78% rename from src/server.rs rename to src/python/server.rs index 6faa98dc..f361aab8 100644 --- a/src/server.rs +++ b/src/python/server.rs @@ -1,3 +1,4 @@ +use super::binding; use eyre::eyre; use eyre::WrapErr; use futures::future::join_all; @@ -9,32 +10,28 @@ use std::collections::{BTreeMap, HashMap}; use std::hash::Hash; use std::hash::Hasher; use std::time::{Duration, Instant}; +use structopt::StructOpt; use tokio::time::timeout; use zenoh::config::Config; use zenoh::prelude::SplitBuffer; -use crate::python_binding::{call, init}; - static DURATION_MILLIS: u64 = 5; -#[derive(Deserialize, Debug)] -struct ConfigVariables { - subscriptions: Vec, + +#[derive(Deserialize, Debug, Clone, StructOpt)] +pub struct PythonCommand { + pub subscriptions: Vec, + pub app: String, + pub function: String, } #[tokio::main] -pub async fn main() -> PyResult<()> { +pub async fn run(variables: PythonCommand) -> PyResult<()> { // Subscribe - let variables = envy::from_env::().unwrap(); - - env_logger::init(); - let config = Config::default(); - let session = zenoh::open(config).await.unwrap(); + let session = zenoh::open(Config::default()).await.unwrap(); // Create a hashmap of all subscriptions. let mut subscribers = HashMap::new(); - let subs = variables.subscriptions.clone(); - - for subscription in &subs { + for subscription in &variables.subscriptions { subscribers.insert(subscription.clone(), session .subscribe(subscription) .await @@ -48,14 +45,13 @@ pub async fn main() -> PyResult<()> { let mut states = BTreeMap::new(); let mut states_hash = hash(&states); - let py_function = init() + let py_function = binding::init(&variables.app, &variables.function) .wrap_err("Failed to init the Python Function") .unwrap(); let duration = Duration::from_millis(DURATION_MILLIS); let mut futures_put = vec![]; loop { - let now = Instant::now(); let mut futures = vec![]; for (_, v) in subscribers.iter_mut() { futures.push(timeout(duration, v.next())); @@ -63,7 +59,7 @@ pub async fn main() -> PyResult<()> { let results = join_all(futures).await; - for (result, subscription) in results.into_iter().zip(&subs) { + for (result, subscription) in results.into_iter().zip(&variables.subscriptions.clone()) { if let Ok(Some(data)) = result { let value = data.value.payload; let binary = value.contiguous(); @@ -82,7 +78,7 @@ pub async fn main() -> PyResult<()> { let now = Instant::now(); - let outputs = call(&py_function, states.clone()).await.unwrap(); + let outputs = binding::call(&py_function, states.clone()).await.unwrap(); println!("call python {:#?}", now.elapsed()); for (key, value) in outputs { From c71cc70340ab19d7edd68633bd6d89ef1293146f Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 23 Mar 2022 11:35:42 +0100 Subject: [PATCH 12/13] Fix loop duration logging --- src/python/server.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/python/server.rs b/src/python/server.rs index f361aab8..5b764808 100644 --- a/src/python/server.rs +++ b/src/python/server.rs @@ -52,6 +52,8 @@ pub async fn run(variables: PythonCommand) -> PyResult<()> { let mut futures_put = vec![]; loop { + let loop_start = Instant::now(); + let mut futures = vec![]; for (_, v) in subscribers.iter_mut() { futures.push(timeout(duration, v.next())); @@ -87,7 +89,7 @@ pub async fn run(variables: PythonCommand) -> PyResult<()> { } states_hash = hash(&states); - println!("loop {:#?}", now.elapsed()); + println!("loop {:#?}", loop_start.elapsed()); } } From b0d74791ad2490521eb36d9cc417f4971bac41a9 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 23 Mar 2022 11:45:01 +0100 Subject: [PATCH 13/13] Don't panic in the Python binding functions --- src/python/binding.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/python/binding.rs b/src/python/binding.rs index f1f7f373..1b0a1612 100644 --- a/src/python/binding.rs +++ b/src/python/binding.rs @@ -4,18 +4,16 @@ use std::collections::{BTreeMap, HashMap}; pub fn init(app: &str, function: &str) -> eyre::Result> { pyo3::prepare_freethreaded_python(); - Ok(Python::with_gil(|py| { + Python::with_gil(|py| { let file = py .import(app) - .wrap_err("The import file was not found. Check your PYTHONPATH env variable.") - .unwrap(); + .wrap_err("The import file was not found. Check your PYTHONPATH env variable.")?; // convert Function into a PyObject let identity = file .getattr(function) - .wrap_err("The Function was not found in the imported file.") - .unwrap(); - identity.to_object(py) - })) + .wrap_err("The Function was not found in the imported file.")?; + Ok(identity.to_object(py)) + }) } pub async fn call( @@ -23,12 +21,12 @@ pub async fn call( states: BTreeMap, ) -> eyre::Result> { Python::with_gil(|py| { - let args = (states.clone().into_py(py),); + let args = (states.into_py(py),); let result = py_function .call(py, args, None) - .wrap_err("The Python function call did not succeed.") - .unwrap(); - result.extract(py) + .wrap_err("The Python function call did not succeed.")?; + result + .extract(py) + .wrap_err("The Python function returned an error.") }) - .wrap_err("") }