From 9f319afb62b510ffe9b1a82f1955c4b954e9652d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 19 Jan 2024 08:25:04 +0900 Subject: [PATCH 001/165] Start 0.2.0-dev --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index ccc4922..e154857 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Zenohex.MixProject do use Mix.Project - @version "0.1.5" + @version "0.2.0-dev" def project do [ From f71ddf9b3958629e85f246aa00e6030cbe0c3f97 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 19 Jan 2024 08:25:17 +0900 Subject: [PATCH 002/165] Remove useless test --- test/zenohex_test.exs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/zenohex_test.exs b/test/zenohex_test.exs index bbd6788..720da75 100644 --- a/test/zenohex_test.exs +++ b/test/zenohex_test.exs @@ -1,8 +1,4 @@ defmodule ZenohexTest do use ExUnit.Case doctest Zenohex - - test "greets the world" do - assert Zenohex.hello() == :world - end end From 5f70339d8ddf16652bdfc8eb21b12aa279ac181c Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 19 Jan 2024 08:26:59 +0900 Subject: [PATCH 003/165] Add native/zenohex_nif by `mix rustler.new` --- native/zenohex_nif/.cargo/config.toml | 5 + native/zenohex_nif/.gitignore | 1 + native/zenohex_nif/Cargo.lock | 149 ++++++++++++++++++++++++++ native/zenohex_nif/Cargo.toml | 13 +++ native/zenohex_nif/README.md | 20 ++++ native/zenohex_nif/src/lib.rs | 6 ++ 6 files changed, 194 insertions(+) create mode 100644 native/zenohex_nif/.cargo/config.toml create mode 100644 native/zenohex_nif/.gitignore create mode 100644 native/zenohex_nif/Cargo.lock create mode 100644 native/zenohex_nif/Cargo.toml create mode 100644 native/zenohex_nif/README.md create mode 100644 native/zenohex_nif/src/lib.rs diff --git a/native/zenohex_nif/.cargo/config.toml b/native/zenohex_nif/.cargo/config.toml new file mode 100644 index 0000000..20f03f3 --- /dev/null +++ b/native/zenohex_nif/.cargo/config.toml @@ -0,0 +1,5 @@ +[target.'cfg(target_os = "macos")'] +rustflags = [ + "-C", "link-arg=-undefined", + "-C", "link-arg=dynamic_lookup", +] diff --git a/native/zenohex_nif/.gitignore b/native/zenohex_nif/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/native/zenohex_nif/.gitignore @@ -0,0 +1 @@ +/target diff --git a/native/zenohex_nif/Cargo.lock b/native/zenohex_nif/Cargo.lock new file mode 100644 index 0000000..b1c4f10 --- /dev/null +++ b/native/zenohex_nif/Cargo.lock @@ -0,0 +1,149 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "proc-macro2" +version = "1.0.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustler" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4b4fea69e23de68c42c06769d6624d2d018da550c17244dd4b691f90ced4a7e" +dependencies = [ + "lazy_static", + "rustler_codegen", + "rustler_sys", +] + +[[package]] +name = "rustler_codegen" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "406061bd07aaf052c344257afed4988c5ec8efe4d2352b4c2cf27ea7c8575b12" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rustler_sys" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7c0740e5322b64e2b952d8f0edce5f90fcf6f6fe74cca3f6e78eb3de5ea858" +dependencies = [ + "regex", + "unreachable", +] + +[[package]] +name = "syn" +version = "2.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "zenohex_nif" +version = "0.1.0" +dependencies = [ + "rustler", +] diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml new file mode 100644 index 0000000..52d4114 --- /dev/null +++ b/native/zenohex_nif/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "zenohex_nif" +version = "0.1.0" +authors = [] +edition = "2021" + +[lib] +name = "zenohex_nif" +path = "src/lib.rs" +crate-type = ["cdylib"] + +[dependencies] +rustler = "0.30.0" diff --git a/native/zenohex_nif/README.md b/native/zenohex_nif/README.md new file mode 100644 index 0000000..2b386e9 --- /dev/null +++ b/native/zenohex_nif/README.md @@ -0,0 +1,20 @@ +# NIF for Elixir.Zenohex.Nif + +## To build the NIF module: + +- Your NIF will now build along with your project. + +## To load the NIF: + +```elixir +defmodule Zenohex.Nif do + use Rustler, otp_app: :zenohex, crate: "zenohex_nif" + + # When your NIF is loaded, it will override this function. + def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) +end +``` + +## Examples + +[This](https://github.com/rusterlium/NifIo) is a complete example of a NIF written in Rust. diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs new file mode 100644 index 0000000..5e6fb40 --- /dev/null +++ b/native/zenohex_nif/src/lib.rs @@ -0,0 +1,6 @@ +#[rustler::nif] +fn add(a: i64, b: i64) -> i64 { + a + b +} + +rustler::init!("Elixir.Zenohex.Nif", [add]); From dd16c8027f49105377f209a76720a43e8a5b82f7 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 19 Jan 2024 08:27:19 +0900 Subject: [PATCH 004/165] Add sample nif.ex and nif_test.exs --- lib/zenohex/nif.ex | 6 ++++++ test/zenohex/nif_test.exs | 9 +++++++++ 2 files changed, 15 insertions(+) create mode 100644 lib/zenohex/nif.ex create mode 100644 test/zenohex/nif_test.exs diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex new file mode 100644 index 0000000..3b2cedc --- /dev/null +++ b/lib/zenohex/nif.ex @@ -0,0 +1,6 @@ +defmodule Zenohex.Nif do + use Rustler, otp_app: :zenohex, crate: "zenohex_nif" + + # When your NIF is loaded, it will override this function. + def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) +end diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs new file mode 100644 index 0000000..241bd10 --- /dev/null +++ b/test/zenohex/nif_test.exs @@ -0,0 +1,9 @@ +defmodule Zenohex.NifTest do + use ExUnit.Case + + alias Zenohex.Nif + + test "add/2" do + assert Nif.add(1, 2) == 3 + end +end From 5ccc6f38417fb91a6e24f7849f0cf95e7cac27c7 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 19 Jan 2024 09:37:09 +0900 Subject: [PATCH 005/165] Add .github/workflows/ci.yaml --- .github/workflows/ci.yaml | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..1a7a4ff --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,45 @@ +env: + OTP_VERSION: 26.1.1 + ELIXIR_VERSION: 1.15.7 + +# based https://github.com/erlef/setup-beam + +on: + push: + branches: + - 'pojiro/0.2.0-dev' + +jobs: + test: + runs-on: ubuntu-latest + + env: + MIX_ENV: test + + steps: + - uses: actions/checkout@v3 + + - uses: erlef/setup-beam@v1 + with: + otp-version: ${{env.OTP_VERSION}} + elixir-version: ${{env.ELIXIR_VERSION}} + + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt + + - name: get deps + run: mix do deps.get, deps.compile + + - name: compile + run: mix compile + + - name: format + run: mix format --check-formatted + + - name: cargo fmt + working-directory: native/zenohex_nif + run: cargo fmt --all -- --check + + - name: test + run: mix test --warnings-as-errors From 4a469a73189318e03ca51e9ecfa057ef530489d0 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 19 Jan 2024 10:44:18 +0900 Subject: [PATCH 006/165] [zenohex_nif] Add zenoh to native/zenohex_nif by `cargo add zenoh` --- native/zenohex_nif/Cargo.lock | 3334 ++++++++++++++++++++++++++++++++- native/zenohex_nif/Cargo.toml | 1 + 2 files changed, 3271 insertions(+), 64 deletions(-) diff --git a/native/zenohex_nif/Cargo.lock b/native/zenohex_nif/Cargo.lock index b1c4f10..193f51b 100644 --- a/native/zenohex_nif/Cargo.lock +++ b/native/zenohex_nif/Cargo.lock @@ -2,6 +2,44 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.2" @@ -12,138 +50,3306 @@ dependencies = [ ] [[package]] -name = "heck" -version = "0.4.1" +name = "allocator-api2" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] -name = "lazy_static" -version = "1.4.0" +name = "anstream" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] [[package]] -name = "memchr" -version = "2.7.1" +name = "anstyle" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] -name = "proc-macro2" -version = "1.0.76" +name = "anstyle-parse" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ - "unicode-ident", + "utf8parse", ] [[package]] -name = "quote" -version = "1.0.35" +name = "anstyle-query" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "proc-macro2", + "windows-sys 0.52.0", ] [[package]] -name = "regex" -version = "1.10.2" +name = "anstyle-wincon" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", + "anstyle", + "windows-sys 0.52.0", ] [[package]] -name = "regex-automata" -version = "0.4.3" +name = "anyhow" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ - "aho-corasick", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +dependencies = [ + "concurrent-queue", + "event-listener 4.0.3", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +dependencies = [ + "async-lock 3.3.0", + "async-task", + "concurrent-queue", + "fastrand 2.0.1", + "futures-lite 2.2.0", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.1.1", + "async-executor", + "async-io 2.3.0", + "async-lock 3.3.0", + "blocking", + "futures-lite 2.2.0", + "once_cell", + "tokio", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb41eb19024a91746eba0773aa5e16036045bbf45733766661099e182ea6a744" +dependencies = [ + "async-lock 3.3.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.2.0", + "parking", + "polling 3.3.2", + "rustix 0.38.30", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.30", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-rustls" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecfa55659849ace733f86ccd219da40abd8bc14124e40b312433e85a5a266e77" +dependencies = [ + "futures-io", + "rustls", +] + +[[package]] +name = "async-signal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +dependencies = [ + "async-io 2.3.0", + "async-lock 2.8.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.30", + "signal-hook-registry", + "slab", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 1.13.0", + "gloo-timers", + "kv-log-macro", + "log", "memchr", - "regex-syntax", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", ] [[package]] -name = "regex-syntax" -version = "0.8.2" +name = "async-task" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] -name = "rustler" -version = "0.30.0" +name = "async-trait" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b4fea69e23de68c42c06769d6624d2d018da550c17244dd4b691f90ced4a7e" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ - "lazy_static", - "rustler_codegen", - "rustler_sys", + "proc-macro2", + "quote", + "syn 2.0.48", ] [[package]] -name = "rustler_codegen" -version = "0.30.0" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406061bd07aaf052c344257afed4988c5ec8efe4d2352b4c2cf27ea7c8575b12" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel 2.1.1", + "async-lock 3.3.0", + "async-task", + "fastrand 2.0.1", + "futures-io", + "futures-lite 2.2.0", + "piper", + "tracing", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cache-padded" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[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.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "4.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.48", ] [[package]] -name = "rustler_sys" -version = "2.3.1" +name = "clap_lex" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7c0740e5322b64e2b952d8f0edce5f90fcf6f6fe74cca3f6e78eb3de5ea858" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ - "regex", - "unreachable", + "crossbeam-utils", ] [[package]] -name = "syn" -version = "2.0.48" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" dependencies = [ "proc-macro2", "quote", - "unicode-ident", + "unicode-xid", ] [[package]] -name = "unicode-ident" -version = "1.0.12" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] -name = "unreachable" -version = "1.0.0" +name = "core-foundation-sys" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ - "void", + "libc", ] [[package]] -name = "void" -version = "1.0.2" +name = "crossbeam-utils" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] -name = "zenohex_nif" -version = "0.1.0" +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "rustler", + "generic-array", + "typenum", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", ] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dyn-clone" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin 0.9.8", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +dependencies = [ + "fastrand 2.0.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnetwork" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" +dependencies = [ + "serde", +] + +[[package]] +name = "is-terminal" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +dependencies = [ + "hermit-abi", + "rustix 0.38.30", + "windows-sys 0.52.0", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "js-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keyed-set" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b79e110283e09081809ca488cf3a9709270c6d4d4c4a32674c39cc438366615a" +dependencies = [ + "hashbrown 0.13.2", +] + +[[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.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[package]] +name = "libloading" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +dependencies = [ + "value-bag", +] + +[[package]] +name = "lz4_flex" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "912b45c753ff5f7f5208307e8ace7d2a2e30d024e26d3509f3dce546c044ce15" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[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.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.2", + "cfg-if", + "libc", +] + +[[package]] +name = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" +dependencies = [ + "num-traits", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "pest_meta" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pnet" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "130c5b738eeda2dc5796fe2671e49027e6935e817ab51b930a36ec9e6a206a64" +dependencies = [ + "ipnetwork", + "pnet_base", + "pnet_datalink", + "pnet_packet", + "pnet_sys", + "pnet_transport", +] + +[[package]] +name = "pnet_base" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cf6fb3ab38b68d01ab2aea03ed3d1132b4868fa4e06285f29f16da01c5f4c" +dependencies = [ + "no-std-net", +] + +[[package]] +name = "pnet_datalink" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad5854abf0067ebbd3967f7d45ebc8976ff577ff0c7bd101c4973ae3c70f98fe" +dependencies = [ + "ipnetwork", + "libc", + "pnet_base", + "pnet_sys", + "winapi", +] + +[[package]] +name = "pnet_macros" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688b17499eee04a0408aca0aa5cba5fc86401d7216de8a63fdf7a4c227871804" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.48", +] + +[[package]] +name = "pnet_macros_support" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea925b72f4bd37f8eab0f221bbe4c78b63498350c983ffa9dd4bcde7e030f56" +dependencies = [ + "pnet_base", +] + +[[package]] +name = "pnet_packet" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a005825396b7fe7a38a8e288dbc342d5034dac80c15212436424fef8ea90ba" +dependencies = [ + "glob", + "pnet_base", + "pnet_macros", + "pnet_macros_support", +] + +[[package]] +name = "pnet_sys" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417c0becd1b573f6d544f73671070b039051e5ad819cc64aa96377b536128d00" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pnet_transport" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2637e14d7de974ee2f74393afccbc8704f3e54e6eb31488715e72481d1662cc3" +dependencies = [ + "libc", + "pnet_base", + "pnet_packet", + "pnet_sys", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "545c980a3880efd47b2e262f6a4bb6daad6555cf3367aa9c4e52895f69537a41" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix 0.38.30", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand", + "ring 0.16.20", + "rustc-hash", + "rustls", + "rustls-native-certs 0.6.3", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2 0.5.5", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[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 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "ringbuffer-spsc" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1938faa63a2362ee1747afb2d10567d0fb1413b9cbd6198a8541485c4f773" +dependencies = [ + "array-init", + "cache-padded", +] + +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustler" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4b4fea69e23de68c42c06769d6624d2d018da550c17244dd4b691f90ced4a7e" +dependencies = [ + "lazy_static", + "rustler_codegen", + "rustler_sys", +] + +[[package]] +name = "rustler_codegen" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "406061bd07aaf052c344257afed4988c5ec8efe4d2352b4c2cf27ea7c8575b12" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "rustler_sys" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7c0740e5322b64e2b952d8f0edce5f90fcf6f6fe74cca3f6e78eb3de5ea858" +dependencies = [ + "regex", + "unreachable", +] + +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "log", + "ring 0.17.7", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.0.0", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-pemfile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +dependencies = [ + "base64", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9d979b3ce68192e42760c7810125eb6cf2ea10efae545a156063e61f314e2a" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4ca26037c909dedb327b48c3327d0ba91d3dd3c4e05dad328f210ffb68e95b" +dependencies = [ + "ring 0.17.7", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "schemars" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "serde", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" + +[[package]] +name = "serde" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_json" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.9.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "shellexpand" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" +dependencies = [ + "dirs", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b187f0231d56fe41bfb12034819dd2bf336422a5866de41bc3fec4b2e3883e8" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stop-token" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af91f480ee899ab2d9f8435bfdfc14d08a5754bd9d3fef1f1a1c23336aad6c8b" +dependencies = [ + "async-channel 1.9.0", + "cfg-if", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "token-cell" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a2b964fdb303b08a4eab04d7c1bad2bca33f8eee334ccd28802f1041c6eb87" +dependencies = [ + "paste", +] + +[[package]] +name = "tokio" +version = "1.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2 0.5.5", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "sha1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[package]] +name = "uhlc" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1eadef1fa26cbbae1276c46781e8f4d888bdda434779c18ae6c2a0e69991885" +dependencies = [ + "humantime", + "lazy_static", + "log", + "rand", + "serde", + "spin 0.9.8", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[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 1.0.109", +] + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "uuid" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +dependencies = [ + "getrandom", +] + +[[package]] +name = "validated_struct" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feef04c049b4beae3037a2a31b8da40d8cebec0b97456f24c7de0ede4ed9efed" +dependencies = [ + "json5", + "serde", + "serde_json", + "validated_struct_macros", +] + +[[package]] +name = "validated_struct_macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d4444a980afa9ef0d29c2a3f4d952ec0495a7a996a9c78b52698b71bc21edb4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unzip-n", +] + +[[package]] +name = "value-bag" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cdbaf5e132e593e9fc1de6a15bbec912395b11fb9719e061cf64f804524c503" + +[[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 = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + +[[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.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" + +[[package]] +name = "web-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de2cfda980f21be5a7ed2eadb3e6fe074d56022bea2cdeb1a62eb220fc04188" +dependencies = [ + "rustls-pki-types", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "zenoh" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a36b83f5835024bdeefd9079b4af86db316f7a3af94214734df34e098cececfd" +dependencies = [ + "async-global-executor", + "async-std", + "async-trait", + "base64", + "const_format", + "env_logger", + "event-listener 4.0.3", + "flume", + "form_urlencoded", + "futures", + "git-version", + "hex", + "lazy_static", + "log", + "ordered-float", + "paste", + "petgraph", + "rand", + "regex", + "rustc_version", + "serde", + "serde_json", + "socket2 0.5.5", + "stop-token", + "uhlc", + "uuid", + "vec_map", + "zenoh-buffers", + "zenoh-codec", + "zenoh-collections", + "zenoh-config", + "zenoh-core", + "zenoh-crypto", + "zenoh-link", + "zenoh-macros", + "zenoh-plugin-trait", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-transport", + "zenoh-util", +] + +[[package]] +name = "zenoh-buffers" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e2261fe0052adb5ef062fde72cbe3e662f7516c8b824b1822484bf74405d9c" +dependencies = [ + "zenoh-collections", +] + +[[package]] +name = "zenoh-codec" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a216c47e82917a33ad52efa136f81dbdee2f7bd7d1c48b7aa064fedff33be9" +dependencies = [ + "log", + "serde", + "uhlc", + "zenoh-buffers", + "zenoh-protocol", +] + +[[package]] +name = "zenoh-collections" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639c58788f591f8f80e9722d1c214c6d6c480ca9f90eeff29b8e929848f25241" + +[[package]] +name = "zenoh-config" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d36ec0bd12e9c3cbe60d4fb04dfd42485d404e886fd46fc096e45037507d721" +dependencies = [ + "flume", + "json5", + "num_cpus", + "secrecy", + "serde", + "serde_json", + "serde_yaml", + "validated_struct", + "zenoh-core", + "zenoh-protocol", + "zenoh-result", + "zenoh-util", +] + +[[package]] +name = "zenoh-core" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447f92480b131892c65b1958d362de4b0db28784cd0efa8c68ed0766ef5f3e4a" +dependencies = [ + "async-std", + "lazy_static", + "zenoh-result", +] + +[[package]] +name = "zenoh-crypto" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5defd1096ee882529e1596c5762cc91c43e6136c6a986dba5be653e1cab65329" +dependencies = [ + "aes", + "hmac", + "rand", + "rand_chacha", + "sha3", + "zenoh-result", +] + +[[package]] +name = "zenoh-keyexpr" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4934fbb00820a45eb360af6c01538607a5e01d4fc0da201338b376ce2329c91a" +dependencies = [ + "hashbrown 0.14.3", + "keyed-set", + "rand", + "schemars", + "serde", + "token-cell", + "zenoh-result", +] + +[[package]] +name = "zenoh-link" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "853e37b4991941dba7ac0a0d18c6cefcc3faea06b504c24e6099595f23352587" +dependencies = [ + "async-std", + "async-trait", + "zenoh-config", + "zenoh-link-commons", + "zenoh-link-quic", + "zenoh-link-tcp", + "zenoh-link-tls", + "zenoh-link-udp", + "zenoh-link-unixsock_stream", + "zenoh-link-ws", + "zenoh-protocol", + "zenoh-result", +] + +[[package]] +name = "zenoh-link-commons" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9ffdae930104183a86a5f888fa7bb02c8c08415c3f715e7d268cd09f5124e3a" +dependencies = [ + "async-std", + "async-trait", + "flume", + "lz4_flex", + "serde", + "typenum", + "zenoh-buffers", + "zenoh-codec", + "zenoh-protocol", + "zenoh-result", +] + +[[package]] +name = "zenoh-link-quic" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa825958f9ed292d241f45e0ac29804790ec39eed57f1a262ffb481c6c2539e" +dependencies = [ + "async-rustls", + "async-std", + "async-trait", + "base64", + "futures", + "log", + "quinn", + "rustls", + "rustls-native-certs 0.7.0", + "rustls-pemfile 2.0.0", + "rustls-webpki 0.102.1", + "secrecy", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-tcp" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e1b9908eecc9ccebbfc41992f82a177e8bd71aa0a70a22326794ede7e8b09d" +dependencies = [ + "async-std", + "async-trait", + "log", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-tls" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc5bafb58c3841d19f0a1b07248c29c4a952cf9fd118a867034c0b6528a3ab5e" +dependencies = [ + "async-rustls", + "async-std", + "async-trait", + "base64", + "futures", + "log", + "rustls", + "rustls-pemfile 2.0.0", + "rustls-webpki 0.102.1", + "secrecy", + "webpki-roots", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-udp" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "540459645821cc63c9aebd6d405509adfec0f5584673f9551de26004ff3ddbff" +dependencies = [ + "async-std", + "async-trait", + "log", + "socket2 0.5.5", + "zenoh-buffers", + "zenoh-collections", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-unixsock_stream" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d281e37dfc0c0ca3bace54dec15bdfd5b12b3cb4a01593e71e1a4ef59e48b57c" +dependencies = [ + "async-std", + "async-trait", + "futures", + "log", + "nix", + "uuid", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", +] + +[[package]] +name = "zenoh-link-ws" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "766663fc1e96c382e59eb009f751744a6967bf76537e1091584382722a5d9d50" +dependencies = [ + "async-std", + "async-trait", + "futures-util", + "log", + "tokio", + "tokio-tungstenite", + "url", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-macros" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2826db61e1526dea78371a1cdf7ce7b933fd390abfbec1eff07b22262cebc4f8" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.48", + "unzip-n", + "zenoh-keyexpr", +] + +[[package]] +name = "zenoh-plugin-trait" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a45fd679f3fdf661ef914ebf4ed8210357bfa7144411f8fdbb18199a903d6270" +dependencies = [ + "libloading", + "log", + "serde_json", + "zenoh-macros", + "zenoh-result", + "zenoh-util", +] + +[[package]] +name = "zenoh-protocol" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af91145a94f60b9165e85b0ac6fa84e2f0448f9cde3e3065f6e73bb5b2ef3c" +dependencies = [ + "const_format", + "hex", + "rand", + "serde", + "uhlc", + "uuid", + "zenoh-buffers", + "zenoh-keyexpr", + "zenoh-result", +] + +[[package]] +name = "zenoh-result" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3b5209dc13bf96dc62921a389af38e757fb0baea54f2078e29636d2238e958" +dependencies = [ + "anyhow", +] + +[[package]] +name = "zenoh-sync" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f515dae61f3216a4c5ed9229fcaa9fb6f5837622f56e94c7454141bfba844b69" +dependencies = [ + "async-std", + "event-listener 4.0.3", + "flume", + "futures", + "tokio", + "zenoh-buffers", + "zenoh-collections", + "zenoh-core", +] + +[[package]] +name = "zenoh-transport" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a888646bbaa18c0901081207eab56200ec13bcaec7b5629b9389ee3255eab6" +dependencies = [ + "async-executor", + "async-global-executor", + "async-std", + "async-trait", + "flume", + "log", + "lz4_flex", + "paste", + "rand", + "ringbuffer-spsc", + "rsa", + "serde", + "sha3", + "zenoh-buffers", + "zenoh-codec", + "zenoh-collections", + "zenoh-config", + "zenoh-core", + "zenoh-crypto", + "zenoh-link", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-util" +version = "0.10.1-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e867296dc177ca7d5870f76374153cc30087ef0ba9914f567addf52e05d2259" +dependencies = [ + "async-std", + "async-trait", + "clap", + "const_format", + "flume", + "futures", + "hex", + "home", + "humantime", + "lazy_static", + "libc", + "libloading", + "log", + "pnet", + "pnet_datalink", + "shellexpand", + "winapi", + "zenoh-core", + "zenoh-protocol", + "zenoh-result", +] + +[[package]] +name = "zenohex_nif" +version = "0.1.0" +dependencies = [ + "rustler", + "zenoh", +] + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml index 52d4114..138696e 100644 --- a/native/zenohex_nif/Cargo.toml +++ b/native/zenohex_nif/Cargo.toml @@ -11,3 +11,4 @@ crate-type = ["cdylib"] [dependencies] rustler = "0.30.0" +zenoh = "0.10.1-rc" From 1851d6b3a30dce2cd9a0cfebacf1f38e44a801c4 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 21 Jan 2024 11:51:48 +0900 Subject: [PATCH 007/165] Add mix_test_watch to deps --- mix.exs | 3 ++- mix.lock | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index e154857..547959f 100644 --- a/mix.exs +++ b/mix.exs @@ -26,7 +26,8 @@ defmodule Zenohex.MixProject do [ {:rustler_precompiled, "~> 0.7.1"}, {:rustler, ">= 0.30.0", optional: true}, - {:ex_doc, "~> 0.31.0", only: :dev} + {:ex_doc, "~> 0.31.0", only: :dev}, + {:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false} ] end diff --git a/mix.lock b/mix.lock index d713c3c..88fc4f4 100644 --- a/mix.lock +++ b/mix.lock @@ -2,10 +2,12 @@ "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"}, + "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.3", "d684f4bac8690e70b06eb52dad65d26de2eefa44cd19d64a8095e1417df7c8fd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b78dc853d2e670ff6390b605d807263bf606da3c82be37f9d7f68635bd886fc9"}, + "mix_test_watch": {:hex, :mix_test_watch, "1.1.1", "eee6fc570d77ad6851c7bc08de420a47fd1e449ef5ccfa6a77ef68b72e7e51ad", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "f82262b54dee533467021723892e15c3267349849f1f737526523ecba4e6baae"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, "rustler": {:hex, :rustler, "0.30.0", "cefc49922132b072853fa9b0ca4dc2ffcb452f68fb73b779042b02d545e097fb", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:toml, "~> 0.6", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "9ef1abb6a7dda35c47cfc649e6a5a61663af6cf842a55814a554a84607dee389"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.7.1", "ecadf02cc59a0eccbaed6c1937303a5827fbcf60010c541595e6d3747d3d0f9f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "b9e4657b99a1483ea31502e1d58c464bedebe9028808eda45c3a429af4550c66"}, From 93b1c982c5f53aabde415e9cd480f06fda72396f Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 19 Jan 2024 21:26:50 +0900 Subject: [PATCH 008/165] [zenohex_nif] Add sample impl --- lib/zenohex/nif.ex | 24 +++++++++ native/zenohex_nif/Cargo.lock | 2 + native/zenohex_nif/Cargo.toml | 2 + native/zenohex_nif/src/lib.rs | 97 ++++++++++++++++++++++++++++++++++- test/zenohex/nif_test.exs | 36 +++++++++++++ 5 files changed, 160 insertions(+), 1 deletion(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 3b2cedc..ca80eeb 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -3,4 +3,28 @@ defmodule Zenohex.Nif do # When your NIF is loaded, it will override this function. def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) + + def test_thread() do + :erlang.nif_error(:nif_not_loaded) + end + + def zenoh_open() do + :erlang.nif_error(:nif_not_loaded) + end + + def declare_publisher(_session, _key_expr) do + :erlang.nif_error(:nif_not_loaded) + end + + def publisher_put(_publisher, _value) do + :erlang.nif_error(:nif_not_loaded) + end + + def declare_subscriber(_session, _key_expr) do + :erlang.nif_error(:nif_not_loaded) + end + + def subscriber_recv_timeout(_subscriber, _timeout_us) do + :erlang.nif_error(:nif_not_loaded) + end end diff --git a/native/zenohex_nif/Cargo.lock b/native/zenohex_nif/Cargo.lock index 193f51b..d0cdde2 100644 --- a/native/zenohex_nif/Cargo.lock +++ b/native/zenohex_nif/Cargo.lock @@ -3324,6 +3324,8 @@ dependencies = [ name = "zenohex_nif" version = "0.1.0" dependencies = [ + "flume", + "futures", "rustler", "zenoh", ] diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml index 138696e..0365090 100644 --- a/native/zenohex_nif/Cargo.toml +++ b/native/zenohex_nif/Cargo.toml @@ -10,5 +10,7 @@ path = "src/lib.rs" crate-type = ["cdylib"] [dependencies] +flume = "0.11.0" +futures = "0.3.30" rustler = "0.30.0" zenoh = "0.10.1-rc" diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 5e6fb40..3154132 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -1,6 +1,101 @@ +use std::sync::Arc; +use std::time::Duration; + +use flume::Receiver; +use rustler::types::atom; +use rustler::{thread, Encoder}; +use rustler::{Atom, Env, ResourceArc, Term}; +use zenoh::prelude::{r#async::*, sync::SyncResolve}; +use zenoh::{publication::Publisher, sample::Sample, subscriber::Subscriber, Session}; + +mod atoms { + rustler::atoms! {timeout} +} + +pub struct ExSessionRef(Arc); +pub struct ExPublisherRef(Publisher<'static>); +pub struct ExSubscriberRef(Subscriber<'static, Receiver>); + #[rustler::nif] fn add(a: i64, b: i64) -> i64 { a + b } -rustler::init!("Elixir.Zenohex.Nif", [add]); +#[rustler::nif] +fn test_thread(env: Env) -> Atom { + let pid = env.pid(); + thread::spawn::(env, move |thread_env| pid.encode(thread_env)); + atom::ok() +} + +#[rustler::nif] +fn zenoh_open() -> ResourceArc { + let config = config::peer(); + let session = zenoh::open(config).res_sync().unwrap(); + ResourceArc::new(ExSessionRef(session.into_arc())) +} + +#[rustler::nif] +fn declare_publisher( + resource: ResourceArc, + key_expr: String, +) -> ResourceArc { + let session: &Arc = &resource.0; + let publisher: Publisher<'_> = session.declare_publisher(key_expr).res_sync().unwrap(); + ResourceArc::new(ExPublisherRef(publisher)) +} + +#[rustler::nif] +fn publisher_put(resource: ResourceArc, value: String) -> Atom { + let publisher: &Publisher = &resource.0; + publisher.put(value).res_sync().unwrap(); + atom::ok() +} + +#[rustler::nif] +fn declare_subscriber( + resource: ResourceArc, + key_expr: String, +) -> ResourceArc { + let session: &Arc = &resource.0; + let subscriber: Subscriber<'_, Receiver> = + session.declare_subscriber(key_expr).res_sync().unwrap(); + ResourceArc::new(ExSubscriberRef(subscriber)) +} + +#[rustler::nif] +fn subscriber_recv_timeout( + env: Env, + resource: ResourceArc, + timeout_us: u64, +) -> Term { + let subscriber: &Subscriber<'_, Receiver> = &resource.0; + match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { + Ok(sample) => { + let sample: Sample = sample; + sample.value.to_string().encode(env) + } + Err(_recv_timeout_error) => atoms::timeout().encode(env), + } +} + +fn load(env: Env, _term: Term) -> bool { + rustler::resource!(ExSessionRef, env); + rustler::resource!(ExPublisherRef, env); + rustler::resource!(ExSubscriberRef, env); + true +} + +rustler::init!( + "Elixir.Zenohex.Nif", + [ + add, + test_thread, + zenoh_open, + declare_publisher, + publisher_put, + declare_subscriber, + subscriber_recv_timeout + ], + load = load +); diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 241bd10..3fb37fb 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -6,4 +6,40 @@ defmodule Zenohex.NifTest do test "add/2" do assert Nif.add(1, 2) == 3 end + + test "test_thread/0" do + pid = self() + assert Nif.test_thread() == :ok + assert_receive ^pid + end + + setup_all do + %{session: Nif.zenoh_open()} + end + + describe "publisher" do + test "declare_publisher/2", %{session: session} do + assert is_reference(Nif.declare_publisher(session, "key/expression")) + end + + test "publisher_put/2", %{session: session} do + publisher = Nif.declare_publisher(session, "key/expression") + assert Nif.publisher_put(publisher, "value") == :ok + end + end + + describe "subscriber" do + test "declare_subscriber/2", %{session: session} do + assert is_reference(Nif.declare_subscriber(session, "key/expression")) + end + + test "subscriber_recv_timeout/1", %{session: session} do + publisher = Nif.declare_publisher(session, "key/expression") + subscriber = Nif.declare_subscriber(session, "key/expression") + + Nif.publisher_put(publisher, "value") + assert Nif.subscriber_recv_timeout(subscriber, 1000) == "value" + assert Nif.subscriber_recv_timeout(subscriber, 1000) == :timeout + end + end end From 9aa71193f4d0b01a6a9c05cffdcae360756e384c Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 21 Jan 2024 13:08:48 +0900 Subject: [PATCH 009/165] [zenohex_nif] Remove unwrap --- native/zenohex_nif/src/lib.rs | 46 +++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 3154132..7d51712 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -29,38 +29,48 @@ fn test_thread(env: Env) -> Atom { } #[rustler::nif] -fn zenoh_open() -> ResourceArc { +fn zenoh_open(env: Env) -> Term { let config = config::peer(); - let session = zenoh::open(config).res_sync().unwrap(); - ResourceArc::new(ExSessionRef(session.into_arc())) + match zenoh::open(config).res_sync() { + Ok(session) => { + let session: Session = session; + ResourceArc::new(ExSessionRef(session.into_arc())).encode(env) + } + Err(_err) => atom::error().encode(env), + } } #[rustler::nif] -fn declare_publisher( - resource: ResourceArc, - key_expr: String, -) -> ResourceArc { +fn declare_publisher(env: Env, resource: ResourceArc, key_expr: String) -> Term { let session: &Arc = &resource.0; - let publisher: Publisher<'_> = session.declare_publisher(key_expr).res_sync().unwrap(); - ResourceArc::new(ExPublisherRef(publisher)) + match session.declare_publisher(key_expr).res_sync() { + Ok(publisher) => { + let publisher: Publisher<'_> = publisher; + ResourceArc::new(ExPublisherRef(publisher)).encode(env) + } + Err(_err) => atom::error().encode(env), + } } #[rustler::nif] fn publisher_put(resource: ResourceArc, value: String) -> Atom { let publisher: &Publisher = &resource.0; - publisher.put(value).res_sync().unwrap(); - atom::ok() + match publisher.put(value).res_sync() { + Ok(()) => atom::ok(), + Err(_err) => atom::error(), + } } #[rustler::nif] -fn declare_subscriber( - resource: ResourceArc, - key_expr: String, -) -> ResourceArc { +fn declare_subscriber(env: Env, resource: ResourceArc, key_expr: String) -> Term { let session: &Arc = &resource.0; - let subscriber: Subscriber<'_, Receiver> = - session.declare_subscriber(key_expr).res_sync().unwrap(); - ResourceArc::new(ExSubscriberRef(subscriber)) + match session.declare_subscriber(key_expr).res_sync() { + Ok(subscriber) => { + let subscriber: Subscriber<'_, Receiver> = subscriber; + ResourceArc::new(ExSubscriberRef(subscriber)).encode(env) + } + Err(_err) => atom::error().encode(env), + } } #[rustler::nif] From 50be07d6c859e075631d0a585efd902ca9036cb5 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 21 Jan 2024 15:29:33 +0900 Subject: [PATCH 010/165] [zenohex_nif] Update header --- native/zenohex_nif/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 7d51712..19c16ea 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -5,7 +5,7 @@ use flume::Receiver; use rustler::types::atom; use rustler::{thread, Encoder}; use rustler::{Atom, Env, ResourceArc, Term}; -use zenoh::prelude::{r#async::*, sync::SyncResolve}; +use zenoh::prelude::sync::*; use zenoh::{publication::Publisher, sample::Sample, subscriber::Subscriber, Session}; mod atoms { From 964a23257b11fddc4f2fe1dc026cc63c16dccc9d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 21 Jan 2024 15:30:22 +0900 Subject: [PATCH 011/165] [zenohex_nif] Add publisher_put_(string|integer|float) --- lib/zenohex/nif.ex | 6 ++++-- native/zenohex_nif/src/lib.rs | 23 +++++++++++++++++++++-- test/zenohex/nif_test.exs | 12 ++++++++---- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index ca80eeb..b6c7fba 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -16,8 +16,10 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - def publisher_put(_publisher, _value) do - :erlang.nif_error(:nif_not_loaded) + for type <- ["string", "integer", "float"] do + def unquote(:"publisher_put_#{type}")(_publisher, _value) do + :erlang.nif_error(:nif_not_loaded) + end end def declare_subscriber(_session, _key_expr) do diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 19c16ea..e6f1336 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -53,7 +53,24 @@ fn declare_publisher(env: Env, resource: ResourceArc, key_expr: St } #[rustler::nif] -fn publisher_put(resource: ResourceArc, value: String) -> Atom { +fn publisher_put_string(resource: ResourceArc, value: String) -> Atom { + publisher_put_impl(resource, value) +} + +#[rustler::nif] +fn publisher_put_integer(resource: ResourceArc, value: i64) -> Atom { + publisher_put_impl(resource, value) +} + +#[rustler::nif] +fn publisher_put_float(resource: ResourceArc, value: f64) -> Atom { + publisher_put_impl(resource, value) +} + +fn publisher_put_impl>( + resource: ResourceArc, + value: T, +) -> Atom { let publisher: &Publisher = &resource.0; match publisher.put(value).res_sync() { Ok(()) => atom::ok(), @@ -103,7 +120,9 @@ rustler::init!( test_thread, zenoh_open, declare_publisher, - publisher_put, + publisher_put_string, + publisher_put_integer, + publisher_put_float, declare_subscriber, subscriber_recv_timeout ], diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 3fb37fb..ed57066 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -22,9 +22,13 @@ defmodule Zenohex.NifTest do assert is_reference(Nif.declare_publisher(session, "key/expression")) end - test "publisher_put/2", %{session: session} do - publisher = Nif.declare_publisher(session, "key/expression") - assert Nif.publisher_put(publisher, "value") == :ok + for {type, value} <- [{"string", "value"}, {"integer", 0}, {"float", 0.0}] do + test "publisher_put_#{type}/2", %{session: session} do + type = unquote(type) + value = unquote(value) + publisher = Nif.declare_publisher(session, "key/expression") + assert apply(Nif, :"publisher_put_#{type}", [publisher, value]) == :ok + end end end @@ -37,7 +41,7 @@ defmodule Zenohex.NifTest do publisher = Nif.declare_publisher(session, "key/expression") subscriber = Nif.declare_subscriber(session, "key/expression") - Nif.publisher_put(publisher, "value") + Nif.publisher_put_string(publisher, "value") assert Nif.subscriber_recv_timeout(subscriber, 1000) == "value" assert Nif.subscriber_recv_timeout(subscriber, 1000) == :timeout end From 814bb1806377651ba52af156d2d9b27641a45ad0 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 22 Jan 2024 09:17:40 +0900 Subject: [PATCH 012/165] [zenohex_nif] Add to_term/2 to lib.rs --- native/zenohex_nif/src/lib.rs | 40 +++++++++++++++++++++++++++++++---- test/zenohex/nif_test.exs | 7 ++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index e6f1336..c800bb4 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -98,14 +98,46 @@ fn subscriber_recv_timeout( ) -> Term { let subscriber: &Subscriber<'_, Receiver> = &resource.0; match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => { - let sample: Sample = sample; - sample.value.to_string().encode(env) - } + Ok(sample) => to_term(&sample, env), Err(_recv_timeout_error) => atoms::timeout().encode(env), } } +fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { + match sample.value.encoding.prefix() { + KnownEncoding::Empty => todo!(), + KnownEncoding::AppOctetStream => todo!(), + KnownEncoding::AppCustom => todo!(), + KnownEncoding::TextPlain => match String::try_from(&sample.value) { + Ok(value) => value.encode(env), + Err(_err) => atom::error().encode(env), + }, + KnownEncoding::AppProperties => todo!(), + KnownEncoding::AppJson => todo!(), + KnownEncoding::AppSql => todo!(), + KnownEncoding::AppInteger => match i64::try_from(&sample.value) { + Ok(value) => value.encode(env), + Err(_err) => atom::error().encode(env), + }, + KnownEncoding::AppFloat => match f64::try_from(&sample.value) { + Ok(value) => value.encode(env), + Err(_err) => atom::error().encode(env), + }, + KnownEncoding::AppXml => todo!(), + KnownEncoding::AppXhtmlXml => todo!(), + KnownEncoding::AppXWwwFormUrlencoded => todo!(), + KnownEncoding::TextJson => todo!(), + KnownEncoding::TextHtml => todo!(), + KnownEncoding::TextXml => todo!(), + KnownEncoding::TextCss => todo!(), + KnownEncoding::TextCsv => todo!(), + KnownEncoding::TextJavascript => todo!(), + KnownEncoding::ImageJpeg => todo!(), + KnownEncoding::ImagePng => todo!(), + KnownEncoding::ImageGif => todo!(), + } +} + fn load(env: Env, _term: Term) -> bool { rustler::resource!(ExSessionRef, env); rustler::resource!(ExPublisherRef, env); diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index ed57066..6508117 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -43,6 +43,13 @@ defmodule Zenohex.NifTest do Nif.publisher_put_string(publisher, "value") assert Nif.subscriber_recv_timeout(subscriber, 1000) == "value" + + Nif.publisher_put_integer(publisher, 0) + assert Nif.subscriber_recv_timeout(subscriber, 1000) == 0 + + Nif.publisher_put_float(publisher, 0.0) + assert Nif.subscriber_recv_timeout(subscriber, 1000) == 0.0 + assert Nif.subscriber_recv_timeout(subscriber, 1000) == :timeout end end From f848eb92324d676ea4056dff6ee2874d30d91e29 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 22 Jan 2024 11:05:57 +0900 Subject: [PATCH 013/165] [zenohex_nif] Support binary pub/sub --- lib/zenohex/nif.ex | 2 +- native/zenohex_nif/src/lib.rs | 19 +++++++++++++++++-- test/zenohex/nif_test.exs | 30 +++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index b6c7fba..4ea5fe5 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -16,7 +16,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - for type <- ["string", "integer", "float"] do + for type <- ["string", "integer", "float", "binary"] do def unquote(:"publisher_put_#{type}")(_publisher, _value) do :erlang.nif_error(:nif_not_loaded) end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index c800bb4..0a487f5 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -1,9 +1,11 @@ +use std::borrow::Cow; +use std::io::Write; use std::sync::Arc; use std::time::Duration; use flume::Receiver; use rustler::types::atom; -use rustler::{thread, Encoder}; +use rustler::{thread, Binary, Encoder, OwnedBinary}; use rustler::{Atom, Env, ResourceArc, Term}; use zenoh::prelude::sync::*; use zenoh::{publication::Publisher, sample::Sample, subscriber::Subscriber, Session}; @@ -67,6 +69,11 @@ fn publisher_put_float(resource: ResourceArc, value: f64) -> Ato publisher_put_impl(resource, value) } +#[rustler::nif] +fn publisher_put_binary(resource: ResourceArc, value: Binary) -> Atom { + publisher_put_impl(resource, Value::from(value.as_slice())) +} + fn publisher_put_impl>( resource: ResourceArc, value: T, @@ -106,7 +113,14 @@ fn subscriber_recv_timeout( fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { match sample.value.encoding.prefix() { KnownEncoding::Empty => todo!(), - KnownEncoding::AppOctetStream => todo!(), + KnownEncoding::AppOctetStream => match Cow::try_from(&sample.value) { + Ok(value) => { + let mut binary = OwnedBinary::new(value.len()).unwrap(); + binary.as_mut_slice().write_all(&value).unwrap(); + binary.release(env).encode(env) + } + Err(_err) => atom::error().encode(env), + }, KnownEncoding::AppCustom => todo!(), KnownEncoding::TextPlain => match String::try_from(&sample.value) { Ok(value) => value.encode(env), @@ -155,6 +169,7 @@ rustler::init!( publisher_put_string, publisher_put_integer, publisher_put_float, + publisher_put_binary, declare_subscriber, subscriber_recv_timeout ], diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 6508117..d6577b4 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -22,7 +22,12 @@ defmodule Zenohex.NifTest do assert is_reference(Nif.declare_publisher(session, "key/expression")) end - for {type, value} <- [{"string", "value"}, {"integer", 0}, {"float", 0.0}] do + for {type, value} <- [ + {"string", "value"}, + {"integer", 0}, + {"float", 0.0}, + {"binary", :erlang.term_to_binary("binary")} + ] do test "publisher_put_#{type}/2", %{session: session} do type = unquote(type) value = unquote(value) @@ -50,7 +55,30 @@ defmodule Zenohex.NifTest do Nif.publisher_put_float(publisher, 0.0) assert Nif.subscriber_recv_timeout(subscriber, 1000) == 0.0 + Nif.publisher_put_binary(publisher, :erlang.term_to_binary("binary")) + assert Nif.subscriber_recv_timeout(subscriber, 1000) == :erlang.term_to_binary("binary") + assert Nif.subscriber_recv_timeout(subscriber, 1000) == :timeout end end + + describe "binary pub/sub" do + setup context do + key_expr = "key/expression" + publisher = Nif.declare_publisher(context.session, key_expr) + subscriber = Nif.declare_subscriber(context.session, key_expr) + %{publisher: publisher, subscriber: subscriber} + end + + for {test_name, binary} <- [ + {"empty binary", ""}, + {"erlang term binary", :erlang.term_to_binary(%URI{})} + ] do + test "#{test_name}", %{publisher: publisher, subscriber: subscriber} do + binary = unquote(binary) + Nif.publisher_put_binary(publisher, binary) + assert Nif.subscriber_recv_timeout(subscriber, 1000) == binary + end + end + end end From e8ec5c7de4623fb7da5b7575d597e6c727ad082f Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 22 Jan 2024 15:23:10 +0900 Subject: [PATCH 014/165] [zenohex_nif] Replcace todo! with unimplemented! --- native/zenohex_nif/src/lib.rs | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 0a487f5..7805ba0 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -112,7 +112,7 @@ fn subscriber_recv_timeout( fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { match sample.value.encoding.prefix() { - KnownEncoding::Empty => todo!(), + KnownEncoding::Empty => unimplemented!(), KnownEncoding::AppOctetStream => match Cow::try_from(&sample.value) { Ok(value) => { let mut binary = OwnedBinary::new(value.len()).unwrap(); @@ -121,14 +121,14 @@ fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { } Err(_err) => atom::error().encode(env), }, - KnownEncoding::AppCustom => todo!(), + KnownEncoding::AppCustom => unimplemented!(), KnownEncoding::TextPlain => match String::try_from(&sample.value) { Ok(value) => value.encode(env), Err(_err) => atom::error().encode(env), }, - KnownEncoding::AppProperties => todo!(), - KnownEncoding::AppJson => todo!(), - KnownEncoding::AppSql => todo!(), + KnownEncoding::AppProperties => unimplemented!(), + KnownEncoding::AppJson => unimplemented!(), + KnownEncoding::AppSql => unimplemented!(), KnownEncoding::AppInteger => match i64::try_from(&sample.value) { Ok(value) => value.encode(env), Err(_err) => atom::error().encode(env), @@ -137,18 +137,18 @@ fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { Ok(value) => value.encode(env), Err(_err) => atom::error().encode(env), }, - KnownEncoding::AppXml => todo!(), - KnownEncoding::AppXhtmlXml => todo!(), - KnownEncoding::AppXWwwFormUrlencoded => todo!(), - KnownEncoding::TextJson => todo!(), - KnownEncoding::TextHtml => todo!(), - KnownEncoding::TextXml => todo!(), - KnownEncoding::TextCss => todo!(), - KnownEncoding::TextCsv => todo!(), - KnownEncoding::TextJavascript => todo!(), - KnownEncoding::ImageJpeg => todo!(), - KnownEncoding::ImagePng => todo!(), - KnownEncoding::ImageGif => todo!(), + KnownEncoding::AppXml => unimplemented!(), + KnownEncoding::AppXhtmlXml => unimplemented!(), + KnownEncoding::AppXWwwFormUrlencoded => unimplemented!(), + KnownEncoding::TextJson => unimplemented!(), + KnownEncoding::TextHtml => unimplemented!(), + KnownEncoding::TextXml => unimplemented!(), + KnownEncoding::TextCss => unimplemented!(), + KnownEncoding::TextCsv => unimplemented!(), + KnownEncoding::TextJavascript => unimplemented!(), + KnownEncoding::ImageJpeg => unimplemented!(), + KnownEncoding::ImagePng => unimplemented!(), + KnownEncoding::ImageGif => unimplemented!(), } } From fa7045c14fbb35bab251ffcf913acdd19e7d31e8 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 23 Jan 2024 11:53:43 +0900 Subject: [PATCH 015/165] [zenohex_nif] Refactor lib.rs error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rustler が panic をハンドリングしてくれることがわかったのでエラーハンドリングを簡素化 --- native/zenohex_nif/src/lib.rs | 54 +++++++++++++++++------------------ 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 7805ba0..afa32dd 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -31,27 +31,23 @@ fn test_thread(env: Env) -> Atom { } #[rustler::nif] -fn zenoh_open(env: Env) -> Term { +fn zenoh_open() -> ResourceArc { let config = config::peer(); - match zenoh::open(config).res_sync() { - Ok(session) => { - let session: Session = session; - ResourceArc::new(ExSessionRef(session.into_arc())).encode(env) - } - Err(_err) => atom::error().encode(env), - } + let session: Session = zenoh::open(config).res_sync().expect("zenoh_open failed"); + ResourceArc::new(ExSessionRef(session.into_arc())) } #[rustler::nif] -fn declare_publisher(env: Env, resource: ResourceArc, key_expr: String) -> Term { +fn declare_publisher( + resource: ResourceArc, + key_expr: String, +) -> ResourceArc { let session: &Arc = &resource.0; - match session.declare_publisher(key_expr).res_sync() { - Ok(publisher) => { - let publisher: Publisher<'_> = publisher; - ResourceArc::new(ExPublisherRef(publisher)).encode(env) - } - Err(_err) => atom::error().encode(env), - } + let publisher: Publisher<'_> = session + .declare_publisher(key_expr) + .res_sync() + .expect("declare_publisher failed"); + ResourceArc::new(ExPublisherRef(publisher)) } #[rustler::nif] @@ -79,22 +75,24 @@ fn publisher_put_impl>( value: T, ) -> Atom { let publisher: &Publisher = &resource.0; - match publisher.put(value).res_sync() { - Ok(()) => atom::ok(), - Err(_err) => atom::error(), - } + publisher + .put(value) + .res_sync() + .expect("publisher_put_impl failed"); + atom::ok() } #[rustler::nif] -fn declare_subscriber(env: Env, resource: ResourceArc, key_expr: String) -> Term { +fn declare_subscriber( + resource: ResourceArc, + key_expr: String, +) -> ResourceArc { let session: &Arc = &resource.0; - match session.declare_subscriber(key_expr).res_sync() { - Ok(subscriber) => { - let subscriber: Subscriber<'_, Receiver> = subscriber; - ResourceArc::new(ExSubscriberRef(subscriber)).encode(env) - } - Err(_err) => atom::error().encode(env), - } + let subscriber: Subscriber<'_, Receiver> = session + .declare_subscriber(key_expr) + .res_sync() + .expect("declare_subscriber failed"); + ResourceArc::new(ExSubscriberRef(subscriber)) } #[rustler::nif] From 6b7d22f27909f6f28735d88b62096d98326fe925 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 23 Jan 2024 13:07:56 +0900 Subject: [PATCH 016/165] [zenohex_nif] Add publisher functions --- lib/zenohex/nif.ex | 14 +++++- native/zenohex_nif/src/lib.rs | 85 +++++++++++++++++++++++++++++++++-- test/zenohex/nif_test.exs | 23 ++++++++++ 3 files changed, 118 insertions(+), 4 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 4ea5fe5..e15ab03 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -12,7 +12,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - def declare_publisher(_session, _key_expr) do + def declare_publisher(_session, _key_expr, _opts \\ []) do :erlang.nif_error(:nif_not_loaded) end @@ -22,6 +22,18 @@ defmodule Zenohex.Nif do end end + def publisher_delete(_publisher) do + :erlang.nif_error(:nif_not_loaded) + end + + def publisher_congestion_control(_publisher, _congestion_control) do + :erlang.nif_error(:nif_not_loaded) + end + + def publisher_priority(_publisher, _priority) do + :erlang.nif_error(:nif_not_loaded) + end + def declare_subscriber(_session, _key_expr) do :erlang.nif_error(:nif_not_loaded) end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index afa32dd..c38b27c 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -5,13 +5,26 @@ use std::time::Duration; use flume::Receiver; use rustler::types::atom; -use rustler::{thread, Binary, Encoder, OwnedBinary}; +use rustler::{thread, Binary, Encoder, ListIterator, OwnedBinary}; use rustler::{Atom, Env, ResourceArc, Term}; use zenoh::prelude::sync::*; use zenoh::{publication::Publisher, sample::Sample, subscriber::Subscriber, Session}; mod atoms { - rustler::atoms! {timeout} + rustler::atoms! { + timeout, + congestion_control, + drop, + block, + priority, + realtime, + interactive_high, + interactive_low, + data_high, + data, + data_low, + background + } } pub struct ExSessionRef(Arc); @@ -41,15 +54,68 @@ fn zenoh_open() -> ResourceArc { fn declare_publisher( resource: ResourceArc, key_expr: String, + opts: ListIterator, ) -> ResourceArc { let session: &Arc = &resource.0; - let publisher: Publisher<'_> = session + let publisher: Publisher = session .declare_publisher(key_expr) .res_sync() .expect("declare_publisher failed"); + + let publisher = opts.fold(publisher, |acc, kv: Term| { + match kv.decode::<(Atom, Atom)>().unwrap() { + (k, v) if k == atoms::congestion_control() => publisher_congestion_control_impl(acc, v), + (k, v) if k == atoms::priority() => publisher_priority_impl(acc, v), + _ => acc, + } + }); + + ResourceArc::new(ExPublisherRef(publisher)) +} + +#[rustler::nif] +fn publisher_congestion_control( + resource: ResourceArc, + value: Atom, +) -> ResourceArc { + let publisher: &Publisher = &resource.0; + let publisher: Publisher = publisher_congestion_control_impl(publisher.clone(), value); + + ResourceArc::new(ExPublisherRef(publisher)) +} + +fn publisher_congestion_control_impl(publisher: Publisher, value: Atom) -> Publisher { + match value { + v if v == atoms::drop() => publisher.congestion_control(CongestionControl::Drop), + v if v == atoms::block() => publisher.congestion_control(CongestionControl::Block), + _ => unreachable!(), + } +} + +#[rustler::nif] +fn publisher_priority( + resource: ResourceArc, + value: Atom, +) -> ResourceArc { + let publisher: &Publisher = &resource.0; + let publisher: Publisher = publisher_priority_impl(publisher.clone(), value); + ResourceArc::new(ExPublisherRef(publisher)) } +fn publisher_priority_impl(publisher: Publisher, value: Atom) -> Publisher { + match value { + v if v == atoms::realtime() => publisher.priority(Priority::RealTime), + v if v == atoms::interactive_high() => publisher.priority(Priority::InteractiveHigh), + v if v == atoms::interactive_low() => publisher.priority(Priority::InteractiveLow), + v if v == atoms::data_high() => publisher.priority(Priority::DataHigh), + v if v == atoms::data() => publisher.priority(Priority::Data), + v if v == atoms::data_low() => publisher.priority(Priority::DataLow), + v if v == atoms::background() => publisher.priority(Priority::Background), + _ => unreachable!(), + } +} + #[rustler::nif] fn publisher_put_string(resource: ResourceArc, value: String) -> Atom { publisher_put_impl(resource, value) @@ -82,6 +148,16 @@ fn publisher_put_impl>( atom::ok() } +#[rustler::nif] +fn publisher_delete(resource: ResourceArc) -> Atom { + let publisher: &Publisher = &resource.0; + publisher + .delete() + .res_sync() + .expect("publisher_delete failed."); + atom::ok() +} + #[rustler::nif] fn declare_subscriber( resource: ResourceArc, @@ -168,6 +244,9 @@ rustler::init!( publisher_put_integer, publisher_put_float, publisher_put_binary, + publisher_delete, + publisher_congestion_control, + publisher_priority, declare_subscriber, subscriber_recv_timeout ], diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index d6577b4..f691188 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -22,6 +22,24 @@ defmodule Zenohex.NifTest do assert is_reference(Nif.declare_publisher(session, "key/expression")) end + test "declare_publisher/3", %{session: session} do + assert is_reference( + Nif.declare_publisher(session, "key/expression", congestion_control: :block) + ) + + assert is_reference(Nif.declare_publisher(session, "key/expression", priority: :realtime)) + end + + test "publisher_congestion_control/2", %{session: session} do + publisher = Nif.declare_publisher(session, "key/expression") + assert is_reference(Nif.publisher_congestion_control(publisher, :block)) + end + + test "publisher_priority/2", %{session: session} do + publisher = Nif.declare_publisher(session, "key/expression") + assert is_reference(Nif.publisher_priority(publisher, :realtime)) + end + for {type, value} <- [ {"string", "value"}, {"integer", 0}, @@ -35,6 +53,11 @@ defmodule Zenohex.NifTest do assert apply(Nif, :"publisher_put_#{type}", [publisher, value]) == :ok end end + + test "publisher_delete/1", %{session: session} do + publisher = Nif.declare_publisher(session, "key/expression") + assert Nif.publisher_delete(publisher) == :ok + end end describe "subscriber" do From bc3eb29b5d17456827d3c113a715d8a5ca7844f8 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 23 Jan 2024 13:23:23 +0900 Subject: [PATCH 017/165] [zenohex_nif] Remove publisher_put_string MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Elixir では String.t() は binary() でまかなえるため --- lib/zenohex/nif.ex | 2 +- native/zenohex_nif/src/lib.rs | 6 ------ test/zenohex/nif_test.exs | 8 ++------ 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index e15ab03..cdd1acd 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -16,7 +16,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - for type <- ["string", "integer", "float", "binary"] do + for type <- ["integer", "float", "binary"] do def unquote(:"publisher_put_#{type}")(_publisher, _value) do :erlang.nif_error(:nif_not_loaded) end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index c38b27c..b637f34 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -116,11 +116,6 @@ fn publisher_priority_impl(publisher: Publisher, value: Atom) -> Publisher { } } -#[rustler::nif] -fn publisher_put_string(resource: ResourceArc, value: String) -> Atom { - publisher_put_impl(resource, value) -} - #[rustler::nif] fn publisher_put_integer(resource: ResourceArc, value: i64) -> Atom { publisher_put_impl(resource, value) @@ -240,7 +235,6 @@ rustler::init!( test_thread, zenoh_open, declare_publisher, - publisher_put_string, publisher_put_integer, publisher_put_float, publisher_put_binary, diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index f691188..7e50c7f 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -41,7 +41,6 @@ defmodule Zenohex.NifTest do end for {type, value} <- [ - {"string", "value"}, {"integer", 0}, {"float", 0.0}, {"binary", :erlang.term_to_binary("binary")} @@ -69,17 +68,14 @@ defmodule Zenohex.NifTest do publisher = Nif.declare_publisher(session, "key/expression") subscriber = Nif.declare_subscriber(session, "key/expression") - Nif.publisher_put_string(publisher, "value") - assert Nif.subscriber_recv_timeout(subscriber, 1000) == "value" - Nif.publisher_put_integer(publisher, 0) assert Nif.subscriber_recv_timeout(subscriber, 1000) == 0 Nif.publisher_put_float(publisher, 0.0) assert Nif.subscriber_recv_timeout(subscriber, 1000) == 0.0 - Nif.publisher_put_binary(publisher, :erlang.term_to_binary("binary")) - assert Nif.subscriber_recv_timeout(subscriber, 1000) == :erlang.term_to_binary("binary") + Nif.publisher_put_binary(publisher, "binary") + assert Nif.subscriber_recv_timeout(subscriber, 1000) == "binary" assert Nif.subscriber_recv_timeout(subscriber, 1000) == :timeout end From c3c18c9ad51f0914ab7a961a1e0b8f436d60ceb8 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 23 Jan 2024 16:33:34 +0900 Subject: [PATCH 018/165] [zenohex_nif] Add declare_subscriber/3 --- lib/zenohex/nif.ex | 2 +- native/zenohex_nif/src/lib.rs | 32 ++++++++++++++++++++++++++------ test/zenohex/nif_test.exs | 6 ++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index cdd1acd..3409e05 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -34,7 +34,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - def declare_subscriber(_session, _key_expr) do + def declare_subscriber(_session, _key_expr, _opts \\ []) do :erlang.nif_error(:nif_not_loaded) end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index b637f34..6ef1014 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -8,6 +8,7 @@ use rustler::types::atom; use rustler::{thread, Binary, Encoder, ListIterator, OwnedBinary}; use rustler::{Atom, Env, ResourceArc, Term}; use zenoh::prelude::sync::*; +use zenoh::subscriber::SubscriberBuilder; use zenoh::{publication::Publisher, sample::Sample, subscriber::Subscriber, Session}; mod atoms { @@ -23,7 +24,13 @@ mod atoms { data_high, data, data_low, - background + background, + mode, + push, + pull, + reliability, + best_effort, + reliable, } } @@ -157,12 +164,25 @@ fn publisher_delete(resource: ResourceArc) -> Atom { fn declare_subscriber( resource: ResourceArc, key_expr: String, + opts: ListIterator, ) -> ResourceArc { let session: &Arc = &resource.0; - let subscriber: Subscriber<'_, Receiver> = session - .declare_subscriber(key_expr) - .res_sync() - .expect("declare_subscriber failed"); + let builder: SubscriberBuilder<_, _> = session.declare_subscriber(key_expr); + + let builder = opts.fold(builder, |acc, kv: Term| { + match kv.decode::<(Atom, Atom)>().unwrap() { + (k, v) if k == atoms::reliability() => match v { + v if v == atoms::best_effort() => acc.best_effort(), + v if v == atoms::reliable() => acc.reliable(), + _ => unreachable!(), + }, + _ => acc, + } + }); + + let subscriber: Subscriber<'_, Receiver> = + builder.res_sync().expect("declare_subscriber failed"); + ResourceArc::new(ExSubscriberRef(subscriber)) } @@ -242,7 +262,7 @@ rustler::init!( publisher_congestion_control, publisher_priority, declare_subscriber, - subscriber_recv_timeout + subscriber_recv_timeout, ], load = load ); diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 7e50c7f..6943a79 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -64,6 +64,12 @@ defmodule Zenohex.NifTest do assert is_reference(Nif.declare_subscriber(session, "key/expression")) end + test "declare_subscriber/3", %{session: session} do + assert is_reference( + Nif.declare_subscriber(session, "key/expression", reliability: :reliable) + ) + end + test "subscriber_recv_timeout/1", %{session: session} do publisher = Nif.declare_publisher(session, "key/expression") subscriber = Nif.declare_subscriber(session, "key/expression") From aa7de11747259cbee0c969f86820e279a697d285 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 23 Jan 2024 17:37:17 +0900 Subject: [PATCH 019/165] [zenohex_nif] Add pull subscriber --- lib/zenohex/nif.ex | 12 +++++++ native/zenohex_nif/src/lib.rs | 59 ++++++++++++++++++++++++++++++++++- test/zenohex/nif_test.exs | 24 +++++++++++++- 3 files changed, 93 insertions(+), 2 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 3409e05..b696ec4 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -41,4 +41,16 @@ defmodule Zenohex.Nif do def subscriber_recv_timeout(_subscriber, _timeout_us) do :erlang.nif_error(:nif_not_loaded) end + + def declare_pull_subscriber(_session, _key_expr, _opts \\ []) do + :erlang.nif_error(:nif_not_loaded) + end + + def pull_subscriber_pull(_pull_subscriber) do + :erlang.nif_error(:nif_not_loaded) + end + + def pull_subscriber_recv_timeout(_pull_subscriber, _timeout_us) do + :erlang.nif_error(:nif_not_loaded) + end end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 6ef1014..b5c5e2b 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -9,7 +9,10 @@ use rustler::{thread, Binary, Encoder, ListIterator, OwnedBinary}; use rustler::{Atom, Env, ResourceArc, Term}; use zenoh::prelude::sync::*; use zenoh::subscriber::SubscriberBuilder; -use zenoh::{publication::Publisher, sample::Sample, subscriber::Subscriber, Session}; +use zenoh::{ + publication::Publisher, sample::Sample, subscriber::PullSubscriber, subscriber::Subscriber, + Session, +}; mod atoms { rustler::atoms! { @@ -37,6 +40,7 @@ mod atoms { pub struct ExSessionRef(Arc); pub struct ExPublisherRef(Publisher<'static>); pub struct ExSubscriberRef(Subscriber<'static, Receiver>); +pub struct ExPullSubscriberRef(PullSubscriber<'static, Receiver>); #[rustler::nif] fn add(a: i64, b: i64) -> i64 { @@ -199,6 +203,55 @@ fn subscriber_recv_timeout( } } +#[rustler::nif] +fn declare_pull_subscriber( + resource: ResourceArc, + key_expr: String, + opts: ListIterator, +) -> ResourceArc { + let session: &Arc = &resource.0; + let builder: SubscriberBuilder<_, _> = session.declare_subscriber(key_expr).pull_mode(); + + let builder = opts.fold(builder, |acc, kv: Term| { + match kv.decode::<(Atom, Atom)>().unwrap() { + (k, v) if k == atoms::reliability() => match v { + v if v == atoms::best_effort() => acc.best_effort(), + v if v == atoms::reliable() => acc.reliable(), + _ => unreachable!(), + }, + _ => acc, + } + }); + + let pull_subscriber: PullSubscriber<'_, Receiver> = + builder.res_sync().expect("declare_pull_subscriber failed"); + + ResourceArc::new(ExPullSubscriberRef(pull_subscriber)) +} + +#[rustler::nif] +fn pull_subscriber_recv_timeout( + env: Env, + resource: ResourceArc, + timeout_us: u64, +) -> Term { + let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; + match pull_subscriber.recv_timeout(Duration::from_micros(timeout_us)) { + Ok(sample) => to_term(&sample, env), + Err(_recv_timeout_error) => atoms::timeout().encode(env), + } +} + +#[rustler::nif] +fn pull_subscriber_pull(resource: ResourceArc) -> Atom { + let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; + pull_subscriber + .pull() + .res_sync() + .expect("pull_subscriber_pull failed"); + atom::ok() +} + fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { match sample.value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), @@ -245,6 +298,7 @@ fn load(env: Env, _term: Term) -> bool { rustler::resource!(ExSessionRef, env); rustler::resource!(ExPublisherRef, env); rustler::resource!(ExSubscriberRef, env); + rustler::resource!(ExPullSubscriberRef, env); true } @@ -263,6 +317,9 @@ rustler::init!( publisher_priority, declare_subscriber, subscriber_recv_timeout, + declare_pull_subscriber, + pull_subscriber_pull, + pull_subscriber_recv_timeout, ], load = load ); diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 6943a79..9551ebc 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -82,11 +82,33 @@ defmodule Zenohex.NifTest do Nif.publisher_put_binary(publisher, "binary") assert Nif.subscriber_recv_timeout(subscriber, 1000) == "binary" - assert Nif.subscriber_recv_timeout(subscriber, 1000) == :timeout end end + describe "pull subscriber" do + test "declare_pull_subscriber/2", %{session: session} do + assert is_reference(Nif.declare_pull_subscriber(session, "key/expression")) + end + + test "declare_pull_subscriber/3", %{session: session} do + assert is_reference( + Nif.declare_pull_subscriber(session, "key/expression", reliability: :reliable) + ) + end + + test "pull_subscriber_pull/1", %{session: session} do + publisher = Nif.declare_publisher(session, "key/expression") + pull_subscriber = Nif.declare_pull_subscriber(session, "key/expression") + + :ok = Nif.publisher_put_integer(publisher, 0) + 0 = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) + :timeout = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) + assert Nif.pull_subscriber_pull(pull_subscriber) == :ok + assert Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) == 0 + end + end + describe "binary pub/sub" do setup context do key_expr = "key/expression" From 212667f5d31d68940b16eeb6009ccede93cef364 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 23 Jan 2024 20:49:02 +0900 Subject: [PATCH 020/165] [zenohex_nif] Add declare_queryable/2,3 --- lib/zenohex/nif.ex | 4 ++++ native/zenohex_nif/src/lib.rs | 33 ++++++++++++++++++++++++++++++--- test/zenohex/nif_test.exs | 10 ++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index b696ec4..104cecd 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -53,4 +53,8 @@ defmodule Zenohex.Nif do def pull_subscriber_recv_timeout(_pull_subscriber, _timeout_us) do :erlang.nif_error(:nif_not_loaded) end + + def declare_queryable(_session, _key_expr, _opts \\ []) do + :erlang.nif_error(:nif_not_loaded) + end end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index b5c5e2b..e1d42c3 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -8,11 +8,11 @@ use rustler::types::atom; use rustler::{thread, Binary, Encoder, ListIterator, OwnedBinary}; use rustler::{Atom, Env, ResourceArc, Term}; use zenoh::prelude::sync::*; -use zenoh::subscriber::SubscriberBuilder; use zenoh::{ - publication::Publisher, sample::Sample, subscriber::PullSubscriber, subscriber::Subscriber, - Session, + publication::Publisher, queryable::Queryable, subscriber::PullSubscriber, + subscriber::Subscriber, Session, }; +use zenoh::{queryable::Query, sample::Sample, subscriber::SubscriberBuilder}; mod atoms { rustler::atoms! { @@ -34,6 +34,7 @@ mod atoms { reliability, best_effort, reliable, + complete, } } @@ -41,6 +42,7 @@ pub struct ExSessionRef(Arc); pub struct ExPublisherRef(Publisher<'static>); pub struct ExSubscriberRef(Subscriber<'static, Receiver>); pub struct ExPullSubscriberRef(PullSubscriber<'static, Receiver>); +pub struct ExQueryableRef(Queryable<'static, Receiver>); #[rustler::nif] fn add(a: i64, b: i64) -> i64 { @@ -252,6 +254,29 @@ fn pull_subscriber_pull(resource: ResourceArc) -> Atom { atom::ok() } +#[rustler::nif] +fn declare_queryable( + resource: ResourceArc, + key_expr: String, + opts: ListIterator, +) -> ResourceArc { + let session: &Arc = &resource.0; + let builder = session.declare_queryable(key_expr); + let builder = opts.fold(builder, |acc, kv: Term| { + match kv.decode::<(Atom, Atom)>().unwrap() { + (k, v) if k == atoms::complete() => match v { + v if v == atom::true_() => acc.complete(true), + v if v == atom::false_() => acc.complete(false), + _ => unreachable!(), + }, + _ => acc, + } + }); + let queryable: Queryable<'_, Receiver> = + builder.res_sync().expect("declare_queryable failed"); + ResourceArc::new(ExQueryableRef(queryable)) +} + fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { match sample.value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), @@ -299,6 +324,7 @@ fn load(env: Env, _term: Term) -> bool { rustler::resource!(ExPublisherRef, env); rustler::resource!(ExSubscriberRef, env); rustler::resource!(ExPullSubscriberRef, env); + rustler::resource!(ExQueryableRef, env); true } @@ -320,6 +346,7 @@ rustler::init!( declare_pull_subscriber, pull_subscriber_pull, pull_subscriber_recv_timeout, + declare_queryable, ], load = load ); diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 9551ebc..5028386 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -128,4 +128,14 @@ defmodule Zenohex.NifTest do end end end + + describe "queryable" do + test "declare_queryable/2", %{session: session} do + assert is_reference(Nif.declare_queryable(session, "key/expression")) + end + + test "declare_queryable/3", %{session: session} do + assert is_reference(Nif.declare_queryable(session, "key/expression", complete: true)) + end + end end From 1763948d37de1370c80eb97521055e08c08ff65f Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 23 Jan 2024 21:38:27 +0900 Subject: [PATCH 021/165] [zenohex_nif] Add session functions --- lib/zenohex/nif.ex | 14 ++++++ native/zenohex_nif/src/lib.rs | 86 +++++++++++++++++++++++++++++++---- test/zenohex/nif_test.exs | 22 +++++++++ 3 files changed, 114 insertions(+), 8 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 104cecd..b2cab43 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -12,6 +12,20 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end + for type <- ["integer", "float", "binary"] do + def unquote(:"session_put_#{type}")(_session, _key_expr, _value) do + :erlang.nif_error(:nif_not_loaded) + end + end + + def session_get_timeout(_session, _selector, _timeout_us) do + :erlang.nif_error(:nif_not_loaded) + end + + def session_delete(_session, _key_expr) do + :erlang.nif_error(:nif_not_loaded) + end + def declare_publisher(_session, _key_expr, _opts \\ []) do :erlang.nif_error(:nif_not_loaded) end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index e1d42c3..a3baa7b 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -63,6 +63,71 @@ fn zenoh_open() -> ResourceArc { ResourceArc::new(ExSessionRef(session.into_arc())) } +#[rustler::nif] +fn session_put_integer(resource: ResourceArc, key_expr: String, value: i64) -> Atom { + let session: &Arc = &resource.0; + session + .put(key_expr, value) + .res_sync() + .expect("session_put_integer failed"); + atom::ok() +} + +#[rustler::nif] +fn session_put_float(resource: ResourceArc, key_expr: String, value: f64) -> Atom { + let session: &Arc = &resource.0; + session + .put(key_expr, value) + .res_sync() + .expect("session_put_float failed"); + atom::ok() +} + +#[rustler::nif] +fn session_put_binary( + resource: ResourceArc, + key_expr: String, + value: Binary, +) -> Atom { + let session: &Arc = &resource.0; + session + .put(key_expr, Value::from(value.as_slice())) + .res_sync() + .expect("session_put_float failed"); + atom::ok() +} + +#[rustler::nif] +fn session_get_timeout( + env: Env, + resource: ResourceArc, + selector: String, + timeout_us: u64, +) -> Term { + let session: &Arc = &resource.0; + let receiver = session + .get(selector) + .res_sync() + .expect("session_get failed"); + match receiver.recv_timeout(Duration::from_micros(timeout_us)) { + Ok(reply) => match reply.sample { + Ok(sample) => to_term(&sample.value, env).encode(env), + Err(value) => to_term(&value, env).encode(env), + }, + Err(_recv_timeout_error) => atoms::timeout().encode(env), + } +} + +#[rustler::nif] +fn session_delete(resource: ResourceArc, key_expr: String) -> Atom { + let session: &Arc = &resource.0; + session + .delete(key_expr) + .res_sync() + .expect("session_delete failed"); + atom::ok() +} + #[rustler::nif] fn declare_publisher( resource: ResourceArc, @@ -200,7 +265,7 @@ fn subscriber_recv_timeout( ) -> Term { let subscriber: &Subscriber<'_, Receiver> = &resource.0; match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => to_term(&sample, env), + Ok(sample) => to_term(&sample.value, env), Err(_recv_timeout_error) => atoms::timeout().encode(env), } } @@ -239,7 +304,7 @@ fn pull_subscriber_recv_timeout( ) -> Term { let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; match pull_subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => to_term(&sample, env), + Ok(sample) => to_term(&sample.value, env), Err(_recv_timeout_error) => atoms::timeout().encode(env), } } @@ -277,10 +342,10 @@ fn declare_queryable( ResourceArc::new(ExQueryableRef(queryable)) } -fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { - match sample.value.encoding.prefix() { +fn to_term<'a>(value: &Value, env: Env<'a>) -> Term<'a> { + match value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), - KnownEncoding::AppOctetStream => match Cow::try_from(&sample.value) { + KnownEncoding::AppOctetStream => match Cow::try_from(value) { Ok(value) => { let mut binary = OwnedBinary::new(value.len()).unwrap(); binary.as_mut_slice().write_all(&value).unwrap(); @@ -289,18 +354,18 @@ fn to_term<'a>(sample: &Sample, env: Env<'a>) -> Term<'a> { Err(_err) => atom::error().encode(env), }, KnownEncoding::AppCustom => unimplemented!(), - KnownEncoding::TextPlain => match String::try_from(&sample.value) { + KnownEncoding::TextPlain => match String::try_from(value) { Ok(value) => value.encode(env), Err(_err) => atom::error().encode(env), }, KnownEncoding::AppProperties => unimplemented!(), KnownEncoding::AppJson => unimplemented!(), KnownEncoding::AppSql => unimplemented!(), - KnownEncoding::AppInteger => match i64::try_from(&sample.value) { + KnownEncoding::AppInteger => match i64::try_from(value) { Ok(value) => value.encode(env), Err(_err) => atom::error().encode(env), }, - KnownEncoding::AppFloat => match f64::try_from(&sample.value) { + KnownEncoding::AppFloat => match f64::try_from(value) { Ok(value) => value.encode(env), Err(_err) => atom::error().encode(env), }, @@ -334,6 +399,11 @@ rustler::init!( add, test_thread, zenoh_open, + session_put_integer, + session_put_float, + session_put_binary, + session_get_timeout, + session_delete, declare_publisher, publisher_put_integer, publisher_put_float, diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 5028386..d328a87 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -17,6 +17,28 @@ defmodule Zenohex.NifTest do %{session: Nif.zenoh_open()} end + describe "session" do + for {type, value} <- [ + {"integer", 0}, + {"float", 0.0}, + {"binary", :erlang.term_to_binary("binary")} + ] do + test "session_put_#{type}/2", %{session: session} do + type = unquote(type) + value = unquote(value) + assert apply(Nif, :"session_put_#{type}", [session, "key/expression", value]) == :ok + end + end + + test "session_get_timeout/3", %{session: session} do + assert Nif.session_get_timeout(session, "key_expression", 1000) == :timeout + end + + test "session_delete/2", %{session: session} do + assert Nif.session_delete(session, "key_expression") == :ok + end + end + describe "publisher" do test "declare_publisher/2", %{session: session} do assert is_reference(Nif.declare_publisher(session, "key/expression")) From 66ae5a9f53e4d3c0c855e28dd139bfda8ba7b48c Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 25 Jan 2024 20:17:24 +0900 Subject: [PATCH 022/165] [zenohex_nif] Improve PublisherOptions --- lib/zenohex/nif.ex | 4 +- lib/zenohex/publisher.ex | 48 +++++++++++++++++ native/zenohex_nif/src/lib.rs | 99 +++++++++++++++++++---------------- test/zenohex/nif_test.exs | 11 ++-- 4 files changed, 110 insertions(+), 52 deletions(-) create mode 100644 lib/zenohex/publisher.ex diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index b2cab43..11a516c 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -1,6 +1,8 @@ defmodule Zenohex.Nif do use Rustler, otp_app: :zenohex, crate: "zenohex_nif" + alias Zenohex.Publisher.Options + # When your NIF is loaded, it will override this function. def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) @@ -26,7 +28,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - def declare_publisher(_session, _key_expr, _opts \\ []) do + def declare_publisher(_session, _key_expr, _opts \\ %Options{}) do :erlang.nif_error(:nif_not_loaded) end diff --git a/lib/zenohex/publisher.ex b/lib/zenohex/publisher.ex new file mode 100644 index 0000000..bea740f --- /dev/null +++ b/lib/zenohex/publisher.ex @@ -0,0 +1,48 @@ +defmodule Zenohex.Publisher do + alias Zenohex.Nif + + @type t :: reference() + @type congestion_control :: :drop | :block + @type priority :: + :real_time + | :interactive_high + | :interactive_low + | :data_high + | :data + | :data_low + | :background + + defmodule Options do + defstruct congestion_control: :drop, priority: :data + end + + @spec put!(t(), binary()) :: :ok + def put!(publisher, value) when is_binary(value) do + Nif.publisher_put_binary(publisher, value) + end + + @spec put!(t(), integer()) :: :ok + def put!(publisher, value) when is_integer(value) do + Nif.publisher_put_integer(publisher, value) + end + + @spec put!(t(), float()) :: :ok + def put!(publisher, value) when is_float(value) do + Nif.publisher_put_float(publisher, value) + end + + @spec delete!(t()) :: :ok + def delete!(publisher) do + Nif.publisher_delete(publisher) + end + + @spec congestion_control!(t(), congestion_control()) :: t() + def congestion_control!(publisher, congestion_control) do + Nif.publisher_congestion_control(publisher, congestion_control) + end + + @spec priority!(t(), priority()) :: t() + def priority!(publisher, priority) do + Nif.publisher_priority(publisher, priority) + end +end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index a3baa7b..68a11bd 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -17,17 +17,6 @@ use zenoh::{queryable::Query, sample::Sample, subscriber::SubscriberBuilder}; mod atoms { rustler::atoms! { timeout, - congestion_control, - drop, - block, - priority, - realtime, - interactive_high, - interactive_low, - data_high, - data, - data_low, - background, mode, push, pull, @@ -132,68 +121,41 @@ fn session_delete(resource: ResourceArc, key_expr: String) -> Atom fn declare_publisher( resource: ResourceArc, key_expr: String, - opts: ListIterator, + opts: PublisherOptions, ) -> ResourceArc { let session: &Arc = &resource.0; let publisher: Publisher = session .declare_publisher(key_expr) + .congestion_control(opts.congestion_control.into()) + .priority(opts.priority.into()) .res_sync() .expect("declare_publisher failed"); - let publisher = opts.fold(publisher, |acc, kv: Term| { - match kv.decode::<(Atom, Atom)>().unwrap() { - (k, v) if k == atoms::congestion_control() => publisher_congestion_control_impl(acc, v), - (k, v) if k == atoms::priority() => publisher_priority_impl(acc, v), - _ => acc, - } - }); - ResourceArc::new(ExPublisherRef(publisher)) } #[rustler::nif] fn publisher_congestion_control( resource: ResourceArc, - value: Atom, + value: CongestionControl, ) -> ResourceArc { let publisher: &Publisher = &resource.0; - let publisher: Publisher = publisher_congestion_control_impl(publisher.clone(), value); + let publisher: Publisher = publisher.clone().congestion_control(value.into()); ResourceArc::new(ExPublisherRef(publisher)) } -fn publisher_congestion_control_impl(publisher: Publisher, value: Atom) -> Publisher { - match value { - v if v == atoms::drop() => publisher.congestion_control(CongestionControl::Drop), - v if v == atoms::block() => publisher.congestion_control(CongestionControl::Block), - _ => unreachable!(), - } -} - #[rustler::nif] fn publisher_priority( resource: ResourceArc, - value: Atom, + value: Priority, ) -> ResourceArc { let publisher: &Publisher = &resource.0; - let publisher: Publisher = publisher_priority_impl(publisher.clone(), value); + let publisher: Publisher = publisher.clone().priority(value.into()); ResourceArc::new(ExPublisherRef(publisher)) } -fn publisher_priority_impl(publisher: Publisher, value: Atom) -> Publisher { - match value { - v if v == atoms::realtime() => publisher.priority(Priority::RealTime), - v if v == atoms::interactive_high() => publisher.priority(Priority::InteractiveHigh), - v if v == atoms::interactive_low() => publisher.priority(Priority::InteractiveLow), - v if v == atoms::data_high() => publisher.priority(Priority::DataHigh), - v if v == atoms::data() => publisher.priority(Priority::Data), - v if v == atoms::data_low() => publisher.priority(Priority::DataLow), - v if v == atoms::background() => publisher.priority(Priority::Background), - _ => unreachable!(), - } -} - #[rustler::nif] fn publisher_put_integer(resource: ResourceArc, value: i64) -> Atom { publisher_put_impl(resource, value) @@ -342,6 +304,53 @@ fn declare_queryable( ResourceArc::new(ExQueryableRef(queryable)) } +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Publisher.Options"] +pub struct PublisherOptions { + congestion_control: CongestionControl, + priority: Priority, +} + +#[derive(rustler::NifUnitEnum)] +pub enum CongestionControl { + Drop, + Block, +} + +impl From for zenoh::publication::CongestionControl { + fn from(value: CongestionControl) -> Self { + match value { + CongestionControl::Drop => zenoh::publication::CongestionControl::Drop, + CongestionControl::Block => zenoh::publication::CongestionControl::Block, + } + } +} + +#[derive(rustler::NifUnitEnum)] +pub enum Priority { + RealTime, + InteractiveHigh, + InteractiveLow, + DataHigh, + Data, + DataLow, + Background, +} + +impl From for zenoh::publication::Priority { + fn from(value: Priority) -> Self { + match value { + Priority::RealTime => zenoh::publication::Priority::RealTime, + Priority::InteractiveHigh => zenoh::publication::Priority::InteractiveHigh, + Priority::InteractiveLow => zenoh::publication::Priority::InteractiveLow, + Priority::DataHigh => zenoh::publication::Priority::DataHigh, + Priority::Data => zenoh::publication::Priority::Data, + Priority::DataLow => zenoh::publication::Priority::DataLow, + Priority::Background => zenoh::publication::Priority::Background, + } + } +} + fn to_term<'a>(value: &Value, env: Env<'a>) -> Term<'a> { match value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index d328a87..1782720 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -40,16 +40,15 @@ defmodule Zenohex.NifTest do end describe "publisher" do + alias Zenohex.Publisher.Options + test "declare_publisher/2", %{session: session} do assert is_reference(Nif.declare_publisher(session, "key/expression")) end test "declare_publisher/3", %{session: session} do - assert is_reference( - Nif.declare_publisher(session, "key/expression", congestion_control: :block) - ) - - assert is_reference(Nif.declare_publisher(session, "key/expression", priority: :realtime)) + opts = %Options{congestion_control: :block, priority: :real_time} + assert is_reference(Nif.declare_publisher(session, "key/expression", opts)) end test "publisher_congestion_control/2", %{session: session} do @@ -59,7 +58,7 @@ defmodule Zenohex.NifTest do test "publisher_priority/2", %{session: session} do publisher = Nif.declare_publisher(session, "key/expression") - assert is_reference(Nif.publisher_priority(publisher, :realtime)) + assert is_reference(Nif.publisher_priority(publisher, :real_time)) end for {type, value} <- [ From 45e13fc4a28449f6b29da2375089d42916793547 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 25 Jan 2024 20:57:01 +0900 Subject: [PATCH 023/165] [zenohex_nif] Improve SubscriberOptions --- lib/zenohex/nif.ex | 9 +++-- lib/zenohex/pull_subscriber.ex | 15 +++++++ lib/zenohex/subscriber.ex | 15 +++++++ native/zenohex_nif/src/lib.rs | 74 ++++++++++++++++------------------ test/zenohex/nif_test.exs | 14 ++++--- 5 files changed, 78 insertions(+), 49 deletions(-) create mode 100644 lib/zenohex/pull_subscriber.ex create mode 100644 lib/zenohex/subscriber.ex diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 11a516c..f980256 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -1,7 +1,8 @@ defmodule Zenohex.Nif do use Rustler, otp_app: :zenohex, crate: "zenohex_nif" - alias Zenohex.Publisher.Options + alias Zenohex.Publisher + alias Zenohex.Subscriber # When your NIF is loaded, it will override this function. def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) @@ -28,7 +29,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - def declare_publisher(_session, _key_expr, _opts \\ %Options{}) do + def declare_publisher(_session, _key_expr, _opts \\ %Publisher.Options{}) do :erlang.nif_error(:nif_not_loaded) end @@ -50,7 +51,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - def declare_subscriber(_session, _key_expr, _opts \\ []) do + def declare_subscriber(_session, _key_expr, _opts \\ %Subscriber.Options{}) do :erlang.nif_error(:nif_not_loaded) end @@ -58,7 +59,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - def declare_pull_subscriber(_session, _key_expr, _opts \\ []) do + def declare_pull_subscriber(_session, _key_expr, _opts \\ %Subscriber.Options{}) do :erlang.nif_error(:nif_not_loaded) end diff --git a/lib/zenohex/pull_subscriber.ex b/lib/zenohex/pull_subscriber.ex new file mode 100644 index 0000000..0ae5c9a --- /dev/null +++ b/lib/zenohex/pull_subscriber.ex @@ -0,0 +1,15 @@ +defmodule Zenohex.PullSubscriber do + alias Zenohex.Nif + + @type t :: reference() + + @spec pull!(t()) :: :ok + def pull!(pull_subscriber) do + Nif.pull_subscriber_pull(pull_subscriber) + end + + @spec recv_timeout!(t(), non_neg_integer()) :: integer() | float() | binary() | :timeout + def recv_timeout!(pull_subscriber, timeout_us) do + Nif.pull_subscriber_recv_timeout(pull_subscriber, timeout_us) + end +end diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex new file mode 100644 index 0000000..45aab7c --- /dev/null +++ b/lib/zenohex/subscriber.ex @@ -0,0 +1,15 @@ +defmodule Zenohex.Subscriber do + alias Zenohex.Nif + + @type t :: reference() + @type reliability :: :best_effort | :reliable + + defmodule Options do + defstruct reliability: :best_effort + end + + @spec recv_timeout!(t(), non_neg_integer()) :: integer() | float() | binary() | :timeout + def recv_timeout!(subscriber, timeout_us) do + Nif.subscriber_recv_timeout(subscriber, timeout_us) + end +end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 68a11bd..228fc6e 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -12,17 +12,11 @@ use zenoh::{ publication::Publisher, queryable::Queryable, subscriber::PullSubscriber, subscriber::Subscriber, Session, }; -use zenoh::{queryable::Query, sample::Sample, subscriber::SubscriberBuilder}; +use zenoh::{queryable::Query, sample::Sample}; mod atoms { rustler::atoms! { timeout, - mode, - push, - pull, - reliability, - best_effort, - reliable, complete, } } @@ -197,24 +191,14 @@ fn publisher_delete(resource: ResourceArc) -> Atom { fn declare_subscriber( resource: ResourceArc, key_expr: String, - opts: ListIterator, + opts: SubscriberOptions, ) -> ResourceArc { let session: &Arc = &resource.0; - let builder: SubscriberBuilder<_, _> = session.declare_subscriber(key_expr); - - let builder = opts.fold(builder, |acc, kv: Term| { - match kv.decode::<(Atom, Atom)>().unwrap() { - (k, v) if k == atoms::reliability() => match v { - v if v == atoms::best_effort() => acc.best_effort(), - v if v == atoms::reliable() => acc.reliable(), - _ => unreachable!(), - }, - _ => acc, - } - }); - - let subscriber: Subscriber<'_, Receiver> = - builder.res_sync().expect("declare_subscriber failed"); + let subscriber: Subscriber<'_, Receiver> = session + .declare_subscriber(key_expr) + .reliability(opts.reliability.into()) + .res_sync() + .expect("declare_subscriber failed"); ResourceArc::new(ExSubscriberRef(subscriber)) } @@ -236,24 +220,15 @@ fn subscriber_recv_timeout( fn declare_pull_subscriber( resource: ResourceArc, key_expr: String, - opts: ListIterator, + opts: SubscriberOptions, ) -> ResourceArc { let session: &Arc = &resource.0; - let builder: SubscriberBuilder<_, _> = session.declare_subscriber(key_expr).pull_mode(); - - let builder = opts.fold(builder, |acc, kv: Term| { - match kv.decode::<(Atom, Atom)>().unwrap() { - (k, v) if k == atoms::reliability() => match v { - v if v == atoms::best_effort() => acc.best_effort(), - v if v == atoms::reliable() => acc.reliable(), - _ => unreachable!(), - }, - _ => acc, - } - }); - - let pull_subscriber: PullSubscriber<'_, Receiver> = - builder.res_sync().expect("declare_pull_subscriber failed"); + let pull_subscriber: PullSubscriber<'_, Receiver> = session + .declare_subscriber(key_expr) + .reliability(opts.reliability.into()) + .pull_mode() + .res_sync() + .expect("declare_pull_subscriber failed"); ResourceArc::new(ExPullSubscriberRef(pull_subscriber)) } @@ -351,6 +326,27 @@ impl From for zenoh::publication::Priority { } } +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Subscriber.Options"] +pub struct SubscriberOptions { + reliability: Reliability, +} + +#[derive(rustler::NifUnitEnum)] +pub enum Reliability { + BestEffort, + Reliable, +} + +impl From for zenoh::subscriber::Reliability { + fn from(value: Reliability) -> Self { + match value { + Reliability::BestEffort => zenoh::subscriber::Reliability::BestEffort, + Reliability::Reliable => zenoh::subscriber::Reliability::Reliable, + } + } +} + fn to_term<'a>(value: &Value, env: Env<'a>) -> Term<'a> { match value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 1782720..d6e3c00 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -81,14 +81,15 @@ defmodule Zenohex.NifTest do end describe "subscriber" do + alias Zenohex.Subscriber.Options + test "declare_subscriber/2", %{session: session} do assert is_reference(Nif.declare_subscriber(session, "key/expression")) end test "declare_subscriber/3", %{session: session} do - assert is_reference( - Nif.declare_subscriber(session, "key/expression", reliability: :reliable) - ) + opts = %Options{reliability: :reliable} + assert is_reference(Nif.declare_subscriber(session, "key/expression", opts)) end test "subscriber_recv_timeout/1", %{session: session} do @@ -108,14 +109,15 @@ defmodule Zenohex.NifTest do end describe "pull subscriber" do + alias Zenohex.Subscriber.Options + test "declare_pull_subscriber/2", %{session: session} do assert is_reference(Nif.declare_pull_subscriber(session, "key/expression")) end test "declare_pull_subscriber/3", %{session: session} do - assert is_reference( - Nif.declare_pull_subscriber(session, "key/expression", reliability: :reliable) - ) + opts = %Options{reliability: :reliable} + assert is_reference(Nif.declare_pull_subscriber(session, "key/expression", opts)) end test "pull_subscriber_pull/1", %{session: session} do From 3501b3936ef8adb9f887aa57cc9d86e9d969e76d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 25 Jan 2024 21:06:03 +0900 Subject: [PATCH 024/165] [zenohex_nif] Improve QueryableOptions --- lib/zenohex/nif.ex | 3 ++- lib/zenohex/queryable.ex | 8 ++++++++ native/zenohex_nif/src/lib.rs | 30 ++++++++++++++---------------- test/zenohex/nif_test.exs | 5 ++++- 4 files changed, 28 insertions(+), 18 deletions(-) create mode 100644 lib/zenohex/queryable.ex diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index f980256..c00c9c8 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -3,6 +3,7 @@ defmodule Zenohex.Nif do alias Zenohex.Publisher alias Zenohex.Subscriber + alias Zenohex.Queryable # When your NIF is loaded, it will override this function. def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) @@ -71,7 +72,7 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end - def declare_queryable(_session, _key_expr, _opts \\ []) do + def declare_queryable(_session, _key_expr, _opts \\ %Queryable.Options{}) do :erlang.nif_error(:nif_not_loaded) end end diff --git a/lib/zenohex/queryable.ex b/lib/zenohex/queryable.ex new file mode 100644 index 0000000..6b449ef --- /dev/null +++ b/lib/zenohex/queryable.ex @@ -0,0 +1,8 @@ +defmodule Zenohex.Queryable do + @type t :: reference() + @type complete :: boolean() + + defmodule Options do + defstruct complete: false + end +end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 228fc6e..49f55df 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -5,7 +5,7 @@ use std::time::Duration; use flume::Receiver; use rustler::types::atom; -use rustler::{thread, Binary, Encoder, ListIterator, OwnedBinary}; +use rustler::{thread, Binary, Encoder, OwnedBinary}; use rustler::{Atom, Env, ResourceArc, Term}; use zenoh::prelude::sync::*; use zenoh::{ @@ -17,7 +17,6 @@ use zenoh::{queryable::Query, sample::Sample}; mod atoms { rustler::atoms! { timeout, - complete, } } @@ -260,22 +259,15 @@ fn pull_subscriber_pull(resource: ResourceArc) -> Atom { fn declare_queryable( resource: ResourceArc, key_expr: String, - opts: ListIterator, + opts: QueryableOptions, ) -> ResourceArc { let session: &Arc = &resource.0; - let builder = session.declare_queryable(key_expr); - let builder = opts.fold(builder, |acc, kv: Term| { - match kv.decode::<(Atom, Atom)>().unwrap() { - (k, v) if k == atoms::complete() => match v { - v if v == atom::true_() => acc.complete(true), - v if v == atom::false_() => acc.complete(false), - _ => unreachable!(), - }, - _ => acc, - } - }); - let queryable: Queryable<'_, Receiver> = - builder.res_sync().expect("declare_queryable failed"); + let queryable: Queryable<'_, Receiver> = session + .declare_queryable(key_expr) + .complete(opts.complete) + .res_sync() + .expect("declare_queryable failed"); + ResourceArc::new(ExQueryableRef(queryable)) } @@ -347,6 +339,12 @@ impl From for zenoh::subscriber::Reliability { } } +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Queryable.Options"] +pub struct QueryableOptions { + complete: bool, +} + fn to_term<'a>(value: &Value, env: Env<'a>) -> Term<'a> { match value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index d6e3c00..36b6069 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -153,12 +153,15 @@ defmodule Zenohex.NifTest do end describe "queryable" do + alias Zenohex.Queryable.Options + test "declare_queryable/2", %{session: session} do assert is_reference(Nif.declare_queryable(session, "key/expression")) end test "declare_queryable/3", %{session: session} do - assert is_reference(Nif.declare_queryable(session, "key/expression", complete: true)) + opts = %Options{complete: true} + assert is_reference(Nif.declare_queryable(session, "key/expression", opts)) end end end From b94628b86258783a8dd9082e578713789697f57f Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 26 Jan 2024 10:07:14 +0900 Subject: [PATCH 025/165] [zenohex_nif] Add publisher mod --- native/zenohex_nif/src/lib.rs | 121 ++-------------------------- native/zenohex_nif/src/publisher.rs | 109 +++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 113 deletions(-) create mode 100644 native/zenohex_nif/src/publisher.rs diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 49f55df..a6f941d 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -19,6 +19,7 @@ mod atoms { timeout, } } +mod publisher; pub struct ExSessionRef(Arc); pub struct ExPublisherRef(Publisher<'static>); @@ -114,7 +115,7 @@ fn session_delete(resource: ResourceArc, key_expr: String) -> Atom fn declare_publisher( resource: ResourceArc, key_expr: String, - opts: PublisherOptions, + opts: publisher::PublisherOptions, ) -> ResourceArc { let session: &Arc = &resource.0; let publisher: Publisher = session @@ -127,65 +128,6 @@ fn declare_publisher( ResourceArc::new(ExPublisherRef(publisher)) } -#[rustler::nif] -fn publisher_congestion_control( - resource: ResourceArc, - value: CongestionControl, -) -> ResourceArc { - let publisher: &Publisher = &resource.0; - let publisher: Publisher = publisher.clone().congestion_control(value.into()); - - ResourceArc::new(ExPublisherRef(publisher)) -} - -#[rustler::nif] -fn publisher_priority( - resource: ResourceArc, - value: Priority, -) -> ResourceArc { - let publisher: &Publisher = &resource.0; - let publisher: Publisher = publisher.clone().priority(value.into()); - - ResourceArc::new(ExPublisherRef(publisher)) -} - -#[rustler::nif] -fn publisher_put_integer(resource: ResourceArc, value: i64) -> Atom { - publisher_put_impl(resource, value) -} - -#[rustler::nif] -fn publisher_put_float(resource: ResourceArc, value: f64) -> Atom { - publisher_put_impl(resource, value) -} - -#[rustler::nif] -fn publisher_put_binary(resource: ResourceArc, value: Binary) -> Atom { - publisher_put_impl(resource, Value::from(value.as_slice())) -} - -fn publisher_put_impl>( - resource: ResourceArc, - value: T, -) -> Atom { - let publisher: &Publisher = &resource.0; - publisher - .put(value) - .res_sync() - .expect("publisher_put_impl failed"); - atom::ok() -} - -#[rustler::nif] -fn publisher_delete(resource: ResourceArc) -> Atom { - let publisher: &Publisher = &resource.0; - publisher - .delete() - .res_sync() - .expect("publisher_delete failed."); - atom::ok() -} - #[rustler::nif] fn declare_subscriber( resource: ResourceArc, @@ -271,53 +213,6 @@ fn declare_queryable( ResourceArc::new(ExQueryableRef(queryable)) } -#[derive(rustler::NifStruct)] -#[module = "Zenohex.Publisher.Options"] -pub struct PublisherOptions { - congestion_control: CongestionControl, - priority: Priority, -} - -#[derive(rustler::NifUnitEnum)] -pub enum CongestionControl { - Drop, - Block, -} - -impl From for zenoh::publication::CongestionControl { - fn from(value: CongestionControl) -> Self { - match value { - CongestionControl::Drop => zenoh::publication::CongestionControl::Drop, - CongestionControl::Block => zenoh::publication::CongestionControl::Block, - } - } -} - -#[derive(rustler::NifUnitEnum)] -pub enum Priority { - RealTime, - InteractiveHigh, - InteractiveLow, - DataHigh, - Data, - DataLow, - Background, -} - -impl From for zenoh::publication::Priority { - fn from(value: Priority) -> Self { - match value { - Priority::RealTime => zenoh::publication::Priority::RealTime, - Priority::InteractiveHigh => zenoh::publication::Priority::InteractiveHigh, - Priority::InteractiveLow => zenoh::publication::Priority::InteractiveLow, - Priority::DataHigh => zenoh::publication::Priority::DataHigh, - Priority::Data => zenoh::publication::Priority::Data, - Priority::DataLow => zenoh::publication::Priority::DataLow, - Priority::Background => zenoh::publication::Priority::Background, - } - } -} - #[derive(rustler::NifStruct)] #[module = "Zenohex.Subscriber.Options"] pub struct SubscriberOptions { @@ -408,12 +303,12 @@ rustler::init!( session_get_timeout, session_delete, declare_publisher, - publisher_put_integer, - publisher_put_float, - publisher_put_binary, - publisher_delete, - publisher_congestion_control, - publisher_priority, + publisher::publisher_put_integer, + publisher::publisher_put_float, + publisher::publisher_put_binary, + publisher::publisher_delete, + publisher::publisher_congestion_control, + publisher::publisher_priority, declare_subscriber, subscriber_recv_timeout, declare_pull_subscriber, diff --git a/native/zenohex_nif/src/publisher.rs b/native/zenohex_nif/src/publisher.rs new file mode 100644 index 0000000..891c8bb --- /dev/null +++ b/native/zenohex_nif/src/publisher.rs @@ -0,0 +1,109 @@ +use crate::ExPublisherRef; +use rustler::{types::atom, Atom, Binary, ResourceArc}; +use zenoh::{prelude::sync::SyncResolve, publication::Publisher, value::Value}; + +#[rustler::nif] +fn publisher_put_integer(resource: ResourceArc, value: i64) -> Atom { + publisher_put_impl(resource, value) +} + +#[rustler::nif] +fn publisher_put_float(resource: ResourceArc, value: f64) -> Atom { + publisher_put_impl(resource, value) +} + +#[rustler::nif] +fn publisher_put_binary(resource: ResourceArc, value: Binary) -> Atom { + publisher_put_impl(resource, Value::from(value.as_slice())) +} + +fn publisher_put_impl>( + resource: ResourceArc, + value: T, +) -> Atom { + let publisher: &Publisher = &resource.0; + publisher + .put(value) + .res_sync() + .expect("publisher_put_impl failed"); + atom::ok() +} + +#[rustler::nif] +fn publisher_delete(resource: ResourceArc) -> Atom { + let publisher: &Publisher = &resource.0; + publisher + .delete() + .res_sync() + .expect("publisher_delete failed."); + atom::ok() +} + +#[rustler::nif] +fn publisher_congestion_control( + resource: ResourceArc, + value: CongestionControl, +) -> ResourceArc { + let publisher: &Publisher = &resource.0; + let publisher: Publisher = publisher.clone().congestion_control(value.into()); + + ResourceArc::new(ExPublisherRef(publisher)) +} + +#[rustler::nif] +fn publisher_priority( + resource: ResourceArc, + value: Priority, +) -> ResourceArc { + let publisher: &Publisher = &resource.0; + let publisher: Publisher = publisher.clone().priority(value.into()); + + ResourceArc::new(ExPublisherRef(publisher)) +} + +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Publisher.Options"] +pub struct PublisherOptions { + pub(crate) congestion_control: CongestionControl, + pub(crate) priority: Priority, +} + +#[derive(rustler::NifUnitEnum)] +pub enum CongestionControl { + Drop, + Block, +} + +impl From for zenoh::publication::CongestionControl { + fn from(value: CongestionControl) -> Self { + match value { + CongestionControl::Drop => zenoh::publication::CongestionControl::Drop, + CongestionControl::Block => zenoh::publication::CongestionControl::Block, + } + } +} + +#[derive(rustler::NifUnitEnum)] +pub enum Priority { + RealTime, + InteractiveHigh, + InteractiveLow, + DataHigh, + Data, + DataLow, + Background, +} + +impl From for zenoh::publication::Priority { + fn from(value: Priority) -> Self { + match value { + Priority::RealTime => zenoh::publication::Priority::RealTime, + Priority::InteractiveHigh => zenoh::publication::Priority::InteractiveHigh, + Priority::InteractiveLow => zenoh::publication::Priority::InteractiveLow, + Priority::DataHigh => zenoh::publication::Priority::DataHigh, + Priority::Data => zenoh::publication::Priority::Data, + Priority::DataLow => zenoh::publication::Priority::DataLow, + Priority::Background => zenoh::publication::Priority::Background, + } + } +} From e66c82e3f6db94b2bba68072a46dff504cfb2dd7 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 26 Jan 2024 10:28:39 +0900 Subject: [PATCH 026/165] [zenohex_nif] Add subscriber mod --- native/zenohex_nif/src/lib.rs | 41 +++------------------------- native/zenohex_nif/src/subscriber.rs | 39 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 37 deletions(-) create mode 100644 native/zenohex_nif/src/subscriber.rs diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index a6f941d..f1f0a80 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -20,6 +20,7 @@ mod atoms { } } mod publisher; +mod subscriber; pub struct ExSessionRef(Arc); pub struct ExPublisherRef(Publisher<'static>); @@ -132,7 +133,7 @@ fn declare_publisher( fn declare_subscriber( resource: ResourceArc, key_expr: String, - opts: SubscriberOptions, + opts: subscriber::SubscriberOptions, ) -> ResourceArc { let session: &Arc = &resource.0; let subscriber: Subscriber<'_, Receiver> = session @@ -144,24 +145,11 @@ fn declare_subscriber( ResourceArc::new(ExSubscriberRef(subscriber)) } -#[rustler::nif] -fn subscriber_recv_timeout( - env: Env, - resource: ResourceArc, - timeout_us: u64, -) -> Term { - let subscriber: &Subscriber<'_, Receiver> = &resource.0; - match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => to_term(&sample.value, env), - Err(_recv_timeout_error) => atoms::timeout().encode(env), - } -} - #[rustler::nif] fn declare_pull_subscriber( resource: ResourceArc, key_expr: String, - opts: SubscriberOptions, + opts: subscriber::SubscriberOptions, ) -> ResourceArc { let session: &Arc = &resource.0; let pull_subscriber: PullSubscriber<'_, Receiver> = session @@ -213,27 +201,6 @@ fn declare_queryable( ResourceArc::new(ExQueryableRef(queryable)) } -#[derive(rustler::NifStruct)] -#[module = "Zenohex.Subscriber.Options"] -pub struct SubscriberOptions { - reliability: Reliability, -} - -#[derive(rustler::NifUnitEnum)] -pub enum Reliability { - BestEffort, - Reliable, -} - -impl From for zenoh::subscriber::Reliability { - fn from(value: Reliability) -> Self { - match value { - Reliability::BestEffort => zenoh::subscriber::Reliability::BestEffort, - Reliability::Reliable => zenoh::subscriber::Reliability::Reliable, - } - } -} - #[derive(rustler::NifStruct)] #[module = "Zenohex.Queryable.Options"] pub struct QueryableOptions { @@ -310,7 +277,7 @@ rustler::init!( publisher::publisher_congestion_control, publisher::publisher_priority, declare_subscriber, - subscriber_recv_timeout, + subscriber::subscriber_recv_timeout, declare_pull_subscriber, pull_subscriber_pull, pull_subscriber_recv_timeout, diff --git a/native/zenohex_nif/src/subscriber.rs b/native/zenohex_nif/src/subscriber.rs new file mode 100644 index 0000000..c6e9aa5 --- /dev/null +++ b/native/zenohex_nif/src/subscriber.rs @@ -0,0 +1,39 @@ +use std::time::Duration; + +use flume::Receiver; +use rustler::{Encoder, Env, ResourceArc, Term}; +use zenoh::{sample::Sample, subscriber::Subscriber}; + +#[rustler::nif] +fn subscriber_recv_timeout( + env: Env, + resource: ResourceArc, + timeout_us: u64, +) -> Term { + let subscriber: &Subscriber<'_, Receiver> = &resource.0; + match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { + Ok(sample) => crate::to_term(&sample.value, env), + Err(_recv_timeout_error) => crate::atoms::timeout().encode(env), + } +} + +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Subscriber.Options"] +pub struct SubscriberOptions { + pub(crate) reliability: Reliability, +} + +#[derive(rustler::NifUnitEnum)] +pub enum Reliability { + BestEffort, + Reliable, +} + +impl From for zenoh::subscriber::Reliability { + fn from(value: Reliability) -> Self { + match value { + Reliability::BestEffort => zenoh::subscriber::Reliability::BestEffort, + Reliability::Reliable => zenoh::subscriber::Reliability::Reliable, + } + } +} From 721a936be282f9182d947ed6978039d954f6b00c Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 26 Jan 2024 10:35:05 +0900 Subject: [PATCH 027/165] [zenohex_nif] Add pull_subscriber mod --- native/zenohex_nif/src/lib.rs | 28 +++-------------------- native/zenohex_nif/src/pull_subscriber.rs | 28 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 25 deletions(-) create mode 100644 native/zenohex_nif/src/pull_subscriber.rs diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index f1f0a80..f81b351 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -20,6 +20,7 @@ mod atoms { } } mod publisher; +mod pull_subscriber; mod subscriber; pub struct ExSessionRef(Arc); @@ -162,29 +163,6 @@ fn declare_pull_subscriber( ResourceArc::new(ExPullSubscriberRef(pull_subscriber)) } -#[rustler::nif] -fn pull_subscriber_recv_timeout( - env: Env, - resource: ResourceArc, - timeout_us: u64, -) -> Term { - let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; - match pull_subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => to_term(&sample.value, env), - Err(_recv_timeout_error) => atoms::timeout().encode(env), - } -} - -#[rustler::nif] -fn pull_subscriber_pull(resource: ResourceArc) -> Atom { - let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; - pull_subscriber - .pull() - .res_sync() - .expect("pull_subscriber_pull failed"); - atom::ok() -} - #[rustler::nif] fn declare_queryable( resource: ResourceArc, @@ -279,8 +257,8 @@ rustler::init!( declare_subscriber, subscriber::subscriber_recv_timeout, declare_pull_subscriber, - pull_subscriber_pull, - pull_subscriber_recv_timeout, + pull_subscriber::pull_subscriber_pull, + pull_subscriber::pull_subscriber_recv_timeout, declare_queryable, ], load = load diff --git a/native/zenohex_nif/src/pull_subscriber.rs b/native/zenohex_nif/src/pull_subscriber.rs new file mode 100644 index 0000000..e0f3ac9 --- /dev/null +++ b/native/zenohex_nif/src/pull_subscriber.rs @@ -0,0 +1,28 @@ +use std::time::Duration; + +use flume::Receiver; +use rustler::{types::atom, Atom, Encoder, Env, ResourceArc, Term}; +use zenoh::{prelude::sync::SyncResolve, sample::Sample, subscriber::PullSubscriber}; + +#[rustler::nif] +fn pull_subscriber_recv_timeout( + env: Env, + resource: ResourceArc, + timeout_us: u64, +) -> Term { + let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; + match pull_subscriber.recv_timeout(Duration::from_micros(timeout_us)) { + Ok(sample) => crate::to_term(&sample.value, env), + Err(_recv_timeout_error) => crate::atoms::timeout().encode(env), + } +} + +#[rustler::nif] +fn pull_subscriber_pull(resource: ResourceArc) -> Atom { + let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; + pull_subscriber + .pull() + .res_sync() + .expect("pull_subscriber_pull failed"); + atom::ok() +} From 3c4834c679b71ca8b0ffd88ddb615f399ceaf00d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 26 Jan 2024 10:38:25 +0900 Subject: [PATCH 028/165] [zenohex_nif] Add queryable mod --- native/zenohex_nif/src/lib.rs | 9 ++------- native/zenohex_nif/src/queryable.rs | 5 +++++ 2 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 native/zenohex_nif/src/queryable.rs diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index f81b351..ac4705f 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -21,6 +21,7 @@ mod atoms { } mod publisher; mod pull_subscriber; +mod queryable; mod subscriber; pub struct ExSessionRef(Arc); @@ -167,7 +168,7 @@ fn declare_pull_subscriber( fn declare_queryable( resource: ResourceArc, key_expr: String, - opts: QueryableOptions, + opts: queryable::QueryableOptions, ) -> ResourceArc { let session: &Arc = &resource.0; let queryable: Queryable<'_, Receiver> = session @@ -179,12 +180,6 @@ fn declare_queryable( ResourceArc::new(ExQueryableRef(queryable)) } -#[derive(rustler::NifStruct)] -#[module = "Zenohex.Queryable.Options"] -pub struct QueryableOptions { - complete: bool, -} - fn to_term<'a>(value: &Value, env: Env<'a>) -> Term<'a> { match value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), diff --git a/native/zenohex_nif/src/queryable.rs b/native/zenohex_nif/src/queryable.rs new file mode 100644 index 0000000..33013ea --- /dev/null +++ b/native/zenohex_nif/src/queryable.rs @@ -0,0 +1,5 @@ +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Queryable.Options"] +pub struct QueryableOptions { + pub(crate) complete: bool, +} From f14f75043e21b7303b5b94827548ef0950bc3d61 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sat, 27 Jan 2024 08:03:54 +0900 Subject: [PATCH 029/165] [zenohex_nif] Add session mod --- native/zenohex_nif/src/lib.rs | 79 +++---------------------------- native/zenohex_nif/src/session.rs | 77 ++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 72 deletions(-) create mode 100644 native/zenohex_nif/src/session.rs diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index ac4705f..bfbd2bf 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -1,11 +1,10 @@ use std::borrow::Cow; use std::io::Write; use std::sync::Arc; -use std::time::Duration; use flume::Receiver; use rustler::types::atom; -use rustler::{thread, Binary, Encoder, OwnedBinary}; +use rustler::{thread, Encoder, OwnedBinary}; use rustler::{Atom, Env, ResourceArc, Term}; use zenoh::prelude::sync::*; use zenoh::{ @@ -22,6 +21,7 @@ mod atoms { mod publisher; mod pull_subscriber; mod queryable; +mod session; mod subscriber; pub struct ExSessionRef(Arc); @@ -49,71 +49,6 @@ fn zenoh_open() -> ResourceArc { ResourceArc::new(ExSessionRef(session.into_arc())) } -#[rustler::nif] -fn session_put_integer(resource: ResourceArc, key_expr: String, value: i64) -> Atom { - let session: &Arc = &resource.0; - session - .put(key_expr, value) - .res_sync() - .expect("session_put_integer failed"); - atom::ok() -} - -#[rustler::nif] -fn session_put_float(resource: ResourceArc, key_expr: String, value: f64) -> Atom { - let session: &Arc = &resource.0; - session - .put(key_expr, value) - .res_sync() - .expect("session_put_float failed"); - atom::ok() -} - -#[rustler::nif] -fn session_put_binary( - resource: ResourceArc, - key_expr: String, - value: Binary, -) -> Atom { - let session: &Arc = &resource.0; - session - .put(key_expr, Value::from(value.as_slice())) - .res_sync() - .expect("session_put_float failed"); - atom::ok() -} - -#[rustler::nif] -fn session_get_timeout( - env: Env, - resource: ResourceArc, - selector: String, - timeout_us: u64, -) -> Term { - let session: &Arc = &resource.0; - let receiver = session - .get(selector) - .res_sync() - .expect("session_get failed"); - match receiver.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(reply) => match reply.sample { - Ok(sample) => to_term(&sample.value, env).encode(env), - Err(value) => to_term(&value, env).encode(env), - }, - Err(_recv_timeout_error) => atoms::timeout().encode(env), - } -} - -#[rustler::nif] -fn session_delete(resource: ResourceArc, key_expr: String) -> Atom { - let session: &Arc = &resource.0; - session - .delete(key_expr) - .res_sync() - .expect("session_delete failed"); - atom::ok() -} - #[rustler::nif] fn declare_publisher( resource: ResourceArc, @@ -237,11 +172,11 @@ rustler::init!( add, test_thread, zenoh_open, - session_put_integer, - session_put_float, - session_put_binary, - session_get_timeout, - session_delete, + session::session_put_integer, + session::session_put_float, + session::session_put_binary, + session::session_get_timeout, + session::session_delete, declare_publisher, publisher::publisher_put_integer, publisher::publisher_put_float, diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs new file mode 100644 index 0000000..ba0a011 --- /dev/null +++ b/native/zenohex_nif/src/session.rs @@ -0,0 +1,77 @@ +use std::{sync::Arc, time::Duration}; + +use rustler::{types::atom, Atom, Binary, Encoder, Env, ResourceArc, Term}; +use zenoh::{prelude::sync::SyncResolve, value::Value, Session}; + +#[rustler::nif] +fn session_put_integer( + resource: ResourceArc, + key_expr: String, + value: i64, +) -> Atom { + let session: &Arc = &resource.0; + session + .put(key_expr, value) + .res_sync() + .expect("session_put_integer failed"); + atom::ok() +} + +#[rustler::nif] +fn session_put_float( + resource: ResourceArc, + key_expr: String, + value: f64, +) -> Atom { + let session: &Arc = &resource.0; + session + .put(key_expr, value) + .res_sync() + .expect("session_put_float failed"); + atom::ok() +} + +#[rustler::nif] +fn session_put_binary( + resource: ResourceArc, + key_expr: String, + value: Binary, +) -> Atom { + let session: &Arc = &resource.0; + session + .put(key_expr, Value::from(value.as_slice())) + .res_sync() + .expect("session_put_float failed"); + atom::ok() +} + +#[rustler::nif] +fn session_get_timeout( + env: Env, + resource: ResourceArc, + selector: String, + timeout_us: u64, +) -> Term { + let session: &Arc = &resource.0; + let receiver = session + .get(selector) + .res_sync() + .expect("session_get failed"); + match receiver.recv_timeout(Duration::from_micros(timeout_us)) { + Ok(reply) => match reply.sample { + Ok(sample) => crate::to_term(&sample.value, env).encode(env), + Err(value) => crate::to_term(&value, env).encode(env), + }, + Err(_recv_timeout_error) => crate::atoms::timeout().encode(env), + } +} + +#[rustler::nif] +fn session_delete(resource: ResourceArc, key_expr: String) -> Atom { + let session: &Arc = &resource.0; + session + .delete(key_expr) + .res_sync() + .expect("session_delete failed"); + atom::ok() +} From ec73c38f0db38deb3db88b49fa9e38c8d7743f8c Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sat, 27 Jan 2024 08:04:04 +0900 Subject: [PATCH 030/165] [zenohex_nif] Reorder rustler::init! funcs --- native/zenohex_nif/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index bfbd2bf..e3ce719 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -172,24 +172,24 @@ rustler::init!( add, test_thread, zenoh_open, + declare_publisher, + declare_subscriber, + declare_pull_subscriber, + declare_queryable, session::session_put_integer, session::session_put_float, session::session_put_binary, session::session_get_timeout, session::session_delete, - declare_publisher, publisher::publisher_put_integer, publisher::publisher_put_float, publisher::publisher_put_binary, publisher::publisher_delete, publisher::publisher_congestion_control, publisher::publisher_priority, - declare_subscriber, subscriber::subscriber_recv_timeout, - declare_pull_subscriber, pull_subscriber::pull_subscriber_pull, pull_subscriber::pull_subscriber_recv_timeout, - declare_queryable, ], load = load ); From df062753170cadbc15c36b909b7901a8396f3665 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 29 Jan 2024 09:47:54 +0900 Subject: [PATCH 031/165] Add credo to deps --- mix.exs | 3 ++- mix.lock | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 547959f..4695782 100644 --- a/mix.exs +++ b/mix.exs @@ -27,7 +27,8 @@ defmodule Zenohex.MixProject do {:rustler_precompiled, "~> 0.7.1"}, {:rustler, ">= 0.30.0", optional: true}, {:ex_doc, "~> 0.31.0", only: :dev}, - {:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false} + {:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false}, + {:credo, "~> 1.7", only: [:dev, :test], runtime: false} ] end diff --git a/mix.lock b/mix.lock index 88fc4f4..a4e1bee 100644 --- a/mix.lock +++ b/mix.lock @@ -1,5 +1,7 @@ %{ + "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, + "credo": {:hex, :credo, "1.7.3", "05bb11eaf2f2b8db370ecaa6a6bda2ec49b2acd5e0418bc106b73b07128c0436", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "35ea675a094c934c22fb1dca3696f3c31f2728ae6ef5a53b5d648c11180a4535"}, "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, From 1ac2e2575c83aa3aefca12ef14d8fb6c0e888cc2 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 29 Jan 2024 09:48:26 +0900 Subject: [PATCH 032/165] Add dialyxir to deps --- mix.exs | 3 ++- mix.lock | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 4695782..6008860 100644 --- a/mix.exs +++ b/mix.exs @@ -28,7 +28,8 @@ defmodule Zenohex.MixProject do {:rustler, ">= 0.30.0", optional: true}, {:ex_doc, "~> 0.31.0", only: :dev}, {:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false}, - {:credo, "~> 1.7", only: [:dev, :test], runtime: false} + {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, + {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false} ] end diff --git a/mix.lock b/mix.lock index a4e1bee..f5a7a78 100644 --- a/mix.lock +++ b/mix.lock @@ -2,7 +2,9 @@ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, "credo": {:hex, :credo, "1.7.3", "05bb11eaf2f2b8db370ecaa6a6bda2ec49b2acd5e0418bc106b73b07128c0436", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "35ea675a094c934c22fb1dca3696f3c31f2728ae6ef5a53b5d648c11180a4535"}, + "dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"}, "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, + "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, From 901d387c4c33ad8780bcee59041d0b4ded131acb Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 29 Jan 2024 16:05:35 +0900 Subject: [PATCH 033/165] [zenohex_nif] Add docs and tests --- lib/zenohex.ex | 17 +++- lib/zenohex/nif.ex | 2 + lib/zenohex/publisher.ex | 70 +++++++++++--- lib/zenohex/pull_subscriber.ex | 31 ++++++- lib/zenohex/queryable.ex | 11 ++- lib/zenohex/session.ex | 128 ++++++++++++++++++++++++++ lib/zenohex/subscriber.ex | 28 +++++- test/zenohex/nif_test.exs | 2 +- test/zenohex/publisher_test.exs | 4 + test/zenohex/pull_subscriber_test.exs | 4 + test/zenohex/session_test.exs | 4 + test/zenohex/subscriber_test.exs | 4 + test/zenohex_test.exs | 15 ++- 13 files changed, 294 insertions(+), 26 deletions(-) create mode 100644 lib/zenohex/session.ex create mode 100644 test/zenohex/publisher_test.exs create mode 100644 test/zenohex/pull_subscriber_test.exs create mode 100644 test/zenohex/session_test.exs create mode 100644 test/zenohex/subscriber_test.exs diff --git a/lib/zenohex.ex b/lib/zenohex.ex index 902a0a9..3c97c97 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -1,13 +1,20 @@ defmodule Zenohex do @moduledoc """ - Documentation for `Zenohex`. + Documentation for `#{__MODULE__}`. """ - @doc """ + alias Zenohex.Nif + alias Zenohex.Session + @doc ~S""" + Open a zenoh Session. + + ## Examples + + iex> Zenohex.open!() """ - @spec open :: NifZenoh.session() - def open do - NifZenoh.zenoh_open() + @spec open! :: Session.t() + def open!() do + Nif.zenoh_open() end end diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index c00c9c8..06c5c31 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Nif do + @moduledoc false + use Rustler, otp_app: :zenohex, crate: "zenohex_nif" alias Zenohex.Publisher diff --git a/lib/zenohex/publisher.ex b/lib/zenohex/publisher.ex index bea740f..4da4212 100644 --- a/lib/zenohex/publisher.ex +++ b/lib/zenohex/publisher.ex @@ -1,21 +1,42 @@ defmodule Zenohex.Publisher do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + alias Zenohex.Nif @type t :: reference() - @type congestion_control :: :drop | :block - @type priority :: - :real_time - | :interactive_high - | :interactive_low - | :data_high - | :data - | :data_low - | :background defmodule Options do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + @type t :: %__MODULE__{congestion_control: congestion_control(), priority: priority()} + @type congestion_control :: :drop | :block + @type priority :: + :real_time + | :interactive_high + | :interactive_low + | :data_high + | :data + | :data_low + | :background + defstruct congestion_control: :drop, priority: :data end + @doc ~S""" + Put data. + + ## Examples + + iex> session = Zenohex.open!() + iex> publisher = Zenohex.Session.declare_publisher!(session, "key/expression") + iex> :ok = Zenohex.Publisher.put!(publisher, "value") + iex> :ok = Zenohex.Publisher.put!(publisher, 0) + iex> :ok = Zenohex.Publisher.put!(publisher, 0.0) + """ @spec put!(t(), binary()) :: :ok def put!(publisher, value) when is_binary(value) do Nif.publisher_put_binary(publisher, value) @@ -31,17 +52,44 @@ defmodule Zenohex.Publisher do Nif.publisher_put_float(publisher, value) end + @doc ~S""" + Delete data. + + ## Examples + + iex> session = Zenohex.open!() + iex> publisher = Zenohex.Session.declare_publisher!(session, "key/expression") + iex> :ok = Zenohex.Publisher.delete!(publisher) + """ @spec delete!(t()) :: :ok def delete!(publisher) do Nif.publisher_delete(publisher) end - @spec congestion_control!(t(), congestion_control()) :: t() + @doc ~S""" + Change the congestion_control to apply when routing the data. + + ## Examples + + iex> session = Zenohex.open!() + iex> publisher = Zenohex.Session.declare_publisher!(session, "key/expression") + iex> Zenohex.Publisher.congestion_control!(publisher, :drop) + """ + @spec congestion_control!(t(), Options.congestion_control()) :: t() def congestion_control!(publisher, congestion_control) do Nif.publisher_congestion_control(publisher, congestion_control) end - @spec priority!(t(), priority()) :: t() + @doc ~S""" + Change the priority of the written data. + + ## Examples + + iex> session = Zenohex.open!() + iex> publisher = Zenohex.Session.declare_publisher!(session, "key/expression") + iex> Zenohex.Publisher.priority!(publisher, :real_time) + """ + @spec priority!(t(), Options.priority()) :: t() def priority!(publisher, priority) do Nif.publisher_priority(publisher, priority) end diff --git a/lib/zenohex/pull_subscriber.ex b/lib/zenohex/pull_subscriber.ex index 0ae5c9a..3cb5130 100644 --- a/lib/zenohex/pull_subscriber.ex +++ b/lib/zenohex/pull_subscriber.ex @@ -1,15 +1,40 @@ defmodule Zenohex.PullSubscriber do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + alias Zenohex.Nif @type t :: reference() + @doc """ + Pull data. + + ## Examples + + iex> session = Zenohex.open!() + iex> subscriber = Zenohex.Session.declare_pull_subscriber!(session, "key/expression") + iex> Zenohex.PullSubscriber.pull!(subscriber) + :ok + """ @spec pull!(t()) :: :ok - def pull!(pull_subscriber) do + def pull!(pull_subscriber) when is_reference(pull_subscriber) do Nif.pull_subscriber_pull(pull_subscriber) end - @spec recv_timeout!(t(), non_neg_integer()) :: integer() | float() | binary() | :timeout - def recv_timeout!(pull_subscriber, timeout_us) do + @doc """ + Receive data. + + ## Examples + + iex> session = Zenohex.open!() + iex> subscriber = Zenohex.Session.declare_pull_subscriber!(session, "key/expression") + iex> Zenohex.PullSubscriber.recv_timeout!(subscriber, 1000) + :timeout + """ + @spec recv_timeout!(t(), pos_integer()) :: integer() | float() | binary() | :timeout + def recv_timeout!(pull_subscriber, timeout_us) + when is_reference(pull_subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.pull_subscriber_recv_timeout(pull_subscriber, timeout_us) end end diff --git a/lib/zenohex/queryable.ex b/lib/zenohex/queryable.ex index 6b449ef..0bda468 100644 --- a/lib/zenohex/queryable.ex +++ b/lib/zenohex/queryable.ex @@ -1,8 +1,17 @@ defmodule Zenohex.Queryable do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + @type t :: reference() - @type complete :: boolean() defmodule Options do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + @type t :: %__MODULE__{complete: complete()} + @type complete :: boolean() defstruct complete: false end end diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex new file mode 100644 index 0000000..cc825c8 --- /dev/null +++ b/lib/zenohex/session.ex @@ -0,0 +1,128 @@ +defmodule Zenohex.Session do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + alias Zenohex.Nif + alias Zenohex.Publisher + alias Zenohex.Subscriber + alias Zenohex.Queryable + + @type t :: reference() + + @doc ~S""" + Create a Publisher for the given key expression. + + ## Examples + + iex> session = Zenohex.open!() + iex> Zenohex.Session.declare_publisher!(session, "key/expression") + """ + @spec declare_publisher!(t(), String.t(), Publisher.Options.t()) :: Publisher.t() + def declare_publisher!(session, key_expr, opts \\ %Publisher.Options{}) + when is_reference(session) and is_binary(key_expr) and is_struct(opts, Publisher.Options) do + Nif.declare_publisher(session, key_expr, opts) + end + + @doc ~S""" + Create a Subscriber for the given key expression. + + ## Examples + + iex> session = Zenohex.open!() + iex> Zenohex.Session.declare_subscriber!(session, "key/expression") + """ + @spec declare_subscriber!(t(), String.t(), Subscriber.Options.t()) :: Subscriber.t() + def declare_subscriber!(session, key_expr, opts \\ %Subscriber.Options{}) + when is_reference(session) and is_binary(key_expr) and is_struct(opts, Subscriber.Options) do + Nif.declare_subscriber(session, key_expr, opts) + end + + @doc ~S""" + Create a PullSubscriber for the given key expression. + + ## Examples + + iex> session = Zenohex.open!() + iex> Zenohex.Session.declare_pull_subscriber!(session, "key/expression") + """ + @spec declare_pull_subscriber!(t(), String.t(), Subscriber.Options.t()) :: Subscriber.t() + def declare_pull_subscriber!(session, key_expr, opts \\ %Subscriber.Options{}) + when is_reference(session) and is_binary(key_expr) and is_struct(opts, Subscriber.Options) do + Nif.declare_pull_subscriber(session, key_expr, opts) + end + + @doc ~S""" + Create a Quaryable for the given key expression. + + ## Examples + + iex> session = Zenohex.open!() + iex> Zenohex.Session.declare_queryable!(session, "key/expression") + """ + @spec declare_queryable!(t(), String.t(), Queryable.Options.t()) :: Queryable.t() + def declare_queryable!(session, key_expr, opts \\ %Queryable.Options{}) + when is_reference(session) and is_binary(key_expr) and is_struct(opts, Queryable.Options) do + Nif.declare_queryable(session, key_expr, opts) + end + + @doc ~S""" + Put data. + + ## Examples + + iex> session = Zenohex.open!() + iex> :ok = Zenohex.Session.put!(session, "key/expression", "value") + iex> :ok = Zenohex.Session.put!(session, "key/expression", 0) + iex> :ok = Zenohex.Session.put!(session, "key/expression", 0.0) + """ + @spec put!(t(), String.t(), binary()) :: :ok + def put!(session, key_expr, value) + when is_reference(session) and is_binary(key_expr) and is_binary(value) do + Nif.session_put_binary(session, key_expr, value) + end + + @spec put!(t(), String.t(), integer()) :: :ok + def put!(session, key_expr, value) + when is_reference(session) and is_binary(key_expr) and is_integer(value) do + Nif.session_put_integer(session, key_expr, value) + end + + @spec put!(t(), String.t(), float()) :: :ok + def put!(session, key_expr, value) + when is_reference(session) and is_binary(key_expr) and is_float(value) do + Nif.session_put_float(session, key_expr, value) + end + + @doc ~S""" + Query data from the matching queryables in the system. + + ## Examples + + iex> session = Zenohex.open!() + iex> Zenohex.Session.get_timeout!(session, "key/**", 1000) + :timeout + """ + @spec get_timeout!(t(), String.t(), pos_integer()) :: + binary() | integer() | float() | :timeout + # FIXME 返り値がリストになるケースがあるはずなので、 Nif を含めて見直し修正すること + def get_timeout!(session, selector, timeout_us) + when is_reference(session) and is_binary(selector) and is_integer(timeout_us) and + timeout_us > 0 do + Nif.session_get_timeout(session, selector, timeout_us) + end + + @doc ~S""" + Delete data. + + ## Examples + + iex> session = Zenohex.open!() + iex> Zenohex.Session.delete!(session, "key/expression") + :ok + """ + @spec delete!(t(), String.t()) :: :ok + def delete!(session, key_expr) when is_reference(session) and is_binary(key_expr) do + Nif.session_delete(session, key_expr) + end +end diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex index 45aab7c..3c9fe57 100644 --- a/lib/zenohex/subscriber.ex +++ b/lib/zenohex/subscriber.ex @@ -1,15 +1,35 @@ defmodule Zenohex.Subscriber do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + alias Zenohex.Nif - @type t :: reference() - @type reliability :: :best_effort | :reliable + @opaque t :: reference() defmodule Options do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + @type t :: %__MODULE__{reliability: reliability()} + @type reliability :: :best_effort | :reliable defstruct reliability: :best_effort end - @spec recv_timeout!(t(), non_neg_integer()) :: integer() | float() | binary() | :timeout - def recv_timeout!(subscriber, timeout_us) do + @doc """ + Receive data. + + ## Examples + + iex> session = Zenohex.open!() + iex> subscriber = Zenohex.Session.declare_subscriber!(session, "key/expression") + iex> Zenohex.Subscriber.recv_timeout!(subscriber, 1000) + :timeout + """ + @spec recv_timeout!(t(), pos_integer()) :: integer() | float() | binary() | :timeout + def recv_timeout!(subscriber, timeout_us) + when is_reference(subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.subscriber_recv_timeout(subscriber, timeout_us) end end diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 36b6069..908b3da 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -1,5 +1,5 @@ defmodule Zenohex.NifTest do - use ExUnit.Case + use ExUnit.Case, async: true alias Zenohex.Nif diff --git a/test/zenohex/publisher_test.exs b/test/zenohex/publisher_test.exs new file mode 100644 index 0000000..87eee73 --- /dev/null +++ b/test/zenohex/publisher_test.exs @@ -0,0 +1,4 @@ +defmodule Zenohex.PublisherTest do + use ExUnit.Case, async: true + doctest Zenohex.Publisher +end diff --git a/test/zenohex/pull_subscriber_test.exs b/test/zenohex/pull_subscriber_test.exs new file mode 100644 index 0000000..8272d6b --- /dev/null +++ b/test/zenohex/pull_subscriber_test.exs @@ -0,0 +1,4 @@ +defmodule Zenohex.PullSubscriberTest do + use ExUnit.Case, async: true + doctest Zenohex.PullSubscriber +end diff --git a/test/zenohex/session_test.exs b/test/zenohex/session_test.exs new file mode 100644 index 0000000..d00c612 --- /dev/null +++ b/test/zenohex/session_test.exs @@ -0,0 +1,4 @@ +defmodule Zenohex.SessionTest do + use ExUnit.Case, async: true + doctest Zenohex.Session +end diff --git a/test/zenohex/subscriber_test.exs b/test/zenohex/subscriber_test.exs new file mode 100644 index 0000000..4d055a8 --- /dev/null +++ b/test/zenohex/subscriber_test.exs @@ -0,0 +1,4 @@ +defmodule Zenohex.SubscriberTest do + use ExUnit.Case, async: true + doctest Zenohex.Subscriber +end diff --git a/test/zenohex_test.exs b/test/zenohex_test.exs index 720da75..cb93faa 100644 --- a/test/zenohex_test.exs +++ b/test/zenohex_test.exs @@ -1,4 +1,17 @@ defmodule ZenohexTest do - use ExUnit.Case + use ExUnit.Case, async: true doctest Zenohex + + test "pub/sub" do + session = Zenohex.open!() + publisher = Zenohex.Session.declare_publisher!(session, "pub/sub") + subscriber = Zenohex.Session.declare_subscriber!(session, "pub/sub") + + for i <- 1..100 do + :ok = Zenohex.Publisher.put!(publisher, "Hello Zenoh Dragon #{i}") + + assert Zenohex.Subscriber.recv_timeout!(subscriber, 1000) == + "Hello Zenoh Dragon #{i}" + end + end end From 91674ff3caa51fdda0ec2aefb77d4446378dbe21 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 29 Jan 2024 16:44:56 +0900 Subject: [PATCH 034/165] Add toml to deps --- mix.exs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 6008860..42d001b 100644 --- a/mix.exs +++ b/mix.exs @@ -29,7 +29,8 @@ defmodule Zenohex.MixProject do {:ex_doc, "~> 0.31.0", only: :dev}, {:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, - {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false} + {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, + {:toml, "~> 0.7", runtime: false} ] end From 2472cc7b63d47d85639de2e6e7eb7f32229adbe7 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 29 Jan 2024 16:26:11 +0900 Subject: [PATCH 035/165] Add test/version_match_test.exs --- .github/workflows/ci.yaml | 2 +- .tool-versions | 4 +-- native/zenohex_nif/Cargo.lock | 2 +- native/zenohex_nif/Cargo.toml | 2 +- test/version_match_test.exs | 60 +++++++++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 test/version_match_test.exs diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1a7a4ff..17d3b80 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,5 +1,5 @@ env: - OTP_VERSION: 26.1.1 + OTP_VERSION: 26.1.2 ELIXIR_VERSION: 1.15.7 # based https://github.com/erlef/setup-beam diff --git a/.tool-versions b/.tool-versions index 9f88665..510eaf4 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -elixir 1.15.6-otp-26 -erlang 26.1.1 +elixir 1.15.7-otp-26 +erlang 26.1.2 diff --git a/native/zenohex_nif/Cargo.lock b/native/zenohex_nif/Cargo.lock index d0cdde2..e6a1038 100644 --- a/native/zenohex_nif/Cargo.lock +++ b/native/zenohex_nif/Cargo.lock @@ -3322,7 +3322,7 @@ dependencies = [ [[package]] name = "zenohex_nif" -version = "0.1.0" +version = "0.2.0-dev" dependencies = [ "flume", "futures", diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml index 0365090..f83fbd7 100644 --- a/native/zenohex_nif/Cargo.toml +++ b/native/zenohex_nif/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zenohex_nif" -version = "0.1.0" +version = "0.2.0-dev" authors = [] edition = "2021" diff --git a/test/version_match_test.exs b/test/version_match_test.exs new file mode 100644 index 0000000..ada7744 --- /dev/null +++ b/test/version_match_test.exs @@ -0,0 +1,60 @@ +defmodule Zenohex.VersionMatchTest do + use ExUnit.Case, async: true + + describe "CI" do + test "version match" do + tool_versions_map = + File.read!(".tool-versions") + |> String.split("\n") + |> Enum.reduce(%{}, fn line, acc -> + cond do + String.contains?(line, "erlang") -> + [_, version] = String.split(line, " ") + Map.put(acc, :erlang, version) + + String.contains?(line, "elixir") -> + [_, version] = String.split(line, " ") + [version, "otp", _] = String.split(version, "-") + Map.put(acc, :elixir, version) + + true -> + acc + end + end) + + ciyaml_versions_map = + File.read!(".github/workflows/ci.yaml") + |> String.split("\n") + |> Enum.reduce(%{}, fn line, acc -> + cond do + String.contains?(line, "OTP_VERSION: ") -> + [_, version] = String.split(line, ": ") + Map.put(acc, :erlang, version) + + String.contains?(line, "ELIXIR_VERSION: ") -> + [_, version] = String.split(line, ": ") + Map.put(acc, :elixir, version) + + true -> + acc + end + end) + + assert tool_versions_map.erlang == ciyaml_versions_map.erlang + assert tool_versions_map.elixir == ciyaml_versions_map.elixir + end + end + + describe "Elixir/Rust" do + test "version match" do + version_on_mix_exs = + Mix.Project.config() + |> Keyword.fetch!(:version) + + version_on_cargo_toml = + Toml.decode_file!("native/zenohex_nif/Cargo.toml")["package"]["version"] + + assert version_on_mix_exs == version_on_cargo_toml + end + end +end From d8238ed13619bdee1390af5f3fcd8c1ed89f71dc Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 09:26:57 +0900 Subject: [PATCH 036/165] [zenohex_nif] Apply rustler_precompiled --- .github/workflows/nif_precompile.yml | 8 ++++---- lib/zenohex/nif.ex | 10 +++++++++- native/zenohex_nif/.cargo/config.toml | 10 ++++++++++ native/zenohex_nif/Cargo.toml | 2 +- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.github/workflows/nif_precompile.yml b/.github/workflows/nif_precompile.yml index 0c5f3eb..16e7014 100644 --- a/.github/workflows/nif_precompile.yml +++ b/.github/workflows/nif_precompile.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - nif: ["2.16", "2.15"] + nif: ["2.15"] job: - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04 , use-cross: true } - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04 , use-cross: true } @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout source code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Extract project version shell: bash @@ -42,12 +42,12 @@ jobs: id: build-crate uses: philss/rustler-precompiled-action@v1.0.0 with: - project-name: nifzenoh + project-name: zenohex_nif project-version: ${{ env.PROJECT_VERSION }} target: ${{ matrix.job.target }} nif-version: ${{ matrix.nif }} use-cross: ${{ matrix.job.use-cross }} - project-dir: "native/nifzenoh" + project-dir: "native/zenohex_nif" - name: Artifact upload uses: actions/upload-artifact@v3 diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 06c5c31..83cdd14 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -1,7 +1,15 @@ defmodule Zenohex.Nif do @moduledoc false - use Rustler, otp_app: :zenohex, crate: "zenohex_nif" + mix_config = Mix.Project.config() + version = mix_config[:version] + github_url = mix_config[:package][:links]["GitHub"] + + use RustlerPrecompiled, + otp_app: :zenohex, + crate: "zenohex_nif", + version: version, + base_url: "#{github_url}/releases/download/v#{version}" alias Zenohex.Publisher alias Zenohex.Subscriber diff --git a/native/zenohex_nif/.cargo/config.toml b/native/zenohex_nif/.cargo/config.toml index 20f03f3..5158329 100644 --- a/native/zenohex_nif/.cargo/config.toml +++ b/native/zenohex_nif/.cargo/config.toml @@ -3,3 +3,13 @@ rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ] + +# See https://github.com/rust-lang/rust/issues/59302 +[target.x86_64-unknown-linux-musl] +rustflags = [ + "-C", "target-feature=-crt-static" +] + +# Provides a small build size, but takes more time to build. +[profile.release] +lto = true diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml index f83fbd7..a7d32f6 100644 --- a/native/zenohex_nif/Cargo.toml +++ b/native/zenohex_nif/Cargo.toml @@ -12,5 +12,5 @@ crate-type = ["cdylib"] [dependencies] flume = "0.11.0" futures = "0.3.30" -rustler = "0.30.0" +rustler = { version = "0.30.0", default-features = false, features = ["derive", "nif_version_2_15"] } zenoh = "0.10.1-rc" From 84b9406ad07fe5c43dd8d21a5bee27b202f3bc85 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 10:18:45 +0900 Subject: [PATCH 037/165] Update .github/workflows/ci.yaml --- .github/workflows/ci.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 17d3b80..3a99783 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,3 +1,5 @@ +name: CI + env: OTP_VERSION: 26.1.2 ELIXIR_VERSION: 1.15.7 @@ -17,7 +19,7 @@ jobs: MIX_ENV: test steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: From 317a2be9d12efca123ba525aaa6ac8a74cf06dbe Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 11:32:32 +0900 Subject: [PATCH 038/165] Remove nifzenoh codes --- checksum-Elixir.NifZenoh.exs | 18 - lib/nif_zenoh.ex | 59 - lib/publisher.ex | 11 - lib/session.ex | 11 - lib/tester.ex | 11 - native/nifzenoh/.cargo/config.toml | 14 - native/nifzenoh/.gitignore | 1 - native/nifzenoh/Cargo.lock | 3274 ---------------------------- native/nifzenoh/Cargo.toml | 21 - native/nifzenoh/Cross.toml | 4 - native/nifzenoh/README.md | 20 - native/nifzenoh/src/lib.rs | 119 - native/nifzenoh/src/tester.rs | 63 - 13 files changed, 3626 deletions(-) delete mode 100644 checksum-Elixir.NifZenoh.exs delete mode 100644 lib/nif_zenoh.ex delete mode 100644 lib/publisher.ex delete mode 100644 lib/session.ex delete mode 100644 lib/tester.ex delete mode 100644 native/nifzenoh/.cargo/config.toml delete mode 100644 native/nifzenoh/.gitignore delete mode 100644 native/nifzenoh/Cargo.lock delete mode 100644 native/nifzenoh/Cargo.toml delete mode 100644 native/nifzenoh/Cross.toml delete mode 100644 native/nifzenoh/README.md delete mode 100644 native/nifzenoh/src/lib.rs delete mode 100644 native/nifzenoh/src/tester.rs diff --git a/checksum-Elixir.NifZenoh.exs b/checksum-Elixir.NifZenoh.exs deleted file mode 100644 index c56f1fb..0000000 --- a/checksum-Elixir.NifZenoh.exs +++ /dev/null @@ -1,18 +0,0 @@ -%{ - "libnifzenoh-v0.1.3-nif-2.15-aarch64-apple-darwin.so.tar.gz" => "sha256:e575f80ec7f5158505d869fe41683840bd66589ac1a13931ed8e69571d24452b", - "libnifzenoh-v0.1.3-nif-2.15-aarch64-unknown-linux-gnu.so.tar.gz" => "sha256:b693ec00cff1a1b770f8175e3507db3fd7a31a096fe526e9dc213155d7b8c6ce", - "libnifzenoh-v0.1.3-nif-2.15-arm-unknown-linux-gnueabihf.so.tar.gz" => "sha256:10b19333605e6da1fef0193c906ecf4e39954e634aaf02087f85de9d21bb9c18", - "libnifzenoh-v0.1.3-nif-2.15-x86_64-apple-darwin.so.tar.gz" => "sha256:22f153adf7f777cf3630c75aec377906f82bb58836583a57a1cd2c4ee8fd9122", - "libnifzenoh-v0.1.3-nif-2.15-x86_64-unknown-linux-gnu.so.tar.gz" => "sha256:4a30af7dd557c2a87c70fc34b6ee4d41001f8ab5ea3b4cfbcbedb2ec5ac7cb6a", - "libnifzenoh-v0.1.3-nif-2.15-x86_64-unknown-linux-musl.so.tar.gz" => "sha256:895ab63756c41b12ae2ea3c152ccd029cec5f821d03635420a3eb606a2f71ef2", - "libnifzenoh-v0.1.3-nif-2.16-aarch64-apple-darwin.so.tar.gz" => "sha256:1ce1cf28a5f1c3e50eadec53f50df92637155f0fd9b1437fb775e84853f8dd20", - "libnifzenoh-v0.1.3-nif-2.16-aarch64-unknown-linux-gnu.so.tar.gz" => "sha256:62fe27ab4ac77e98b8ead32374c166f6060ceac7dbad0288e16530401795575e", - "libnifzenoh-v0.1.3-nif-2.16-arm-unknown-linux-gnueabihf.so.tar.gz" => "sha256:9413820ba7550a501b12d869b688e1714eb2f1ad0cf36f6c5189d76ae71c27e5", - "libnifzenoh-v0.1.3-nif-2.16-x86_64-apple-darwin.so.tar.gz" => "sha256:38414f9092a9f89f55f378bf55d39b29ec6edaa6b3490ba1681429fbd0fa179f", - "libnifzenoh-v0.1.3-nif-2.16-x86_64-unknown-linux-gnu.so.tar.gz" => "sha256:bed047c01f4410898c98e083f21f5dcb62731b3e414b257ade7f98c9e12f94f8", - "libnifzenoh-v0.1.3-nif-2.16-x86_64-unknown-linux-musl.so.tar.gz" => "sha256:27bba8210a88f3b601fea0f1ac328e7da10a083ab99b30ebc856578b2f54dc29", - "nifzenoh-v0.1.3-nif-2.15-x86_64-pc-windows-gnu.dll.tar.gz" => "sha256:645184368a09a1e418a11b03bf9581193fa90c9b1f6d4efb7a0d8ff237c04a39", - "nifzenoh-v0.1.3-nif-2.15-x86_64-pc-windows-msvc.dll.tar.gz" => "sha256:c4700abbf0408b2174e11cfc633d3661df1f4abb5f1b992e3e89cb9bb3f0839a", - "nifzenoh-v0.1.3-nif-2.16-x86_64-pc-windows-gnu.dll.tar.gz" => "sha256:f0efedb893f0a6b33a5fc665c02ced36fe4611b0b480507491b8cbb5abb894d3", - "nifzenoh-v0.1.3-nif-2.16-x86_64-pc-windows-msvc.dll.tar.gz" => "sha256:46bd8c0fc5cf35edbb95b6f4fa95cffa02c613c3756507d66400c2a88f147fde", -} diff --git a/lib/nif_zenoh.ex b/lib/nif_zenoh.ex deleted file mode 100644 index 0bebc9a..0000000 --- a/lib/nif_zenoh.ex +++ /dev/null @@ -1,59 +0,0 @@ -defmodule NifZenoh do - version = Mix.Project.config()[:version] - - use RustlerPrecompiled, - otp_app: :zenohex, - crate: "nifzenoh", - base_url: "https://github.com/b5g-ex/zenohex/releases/download/v#{version}", - force_build: System.get_env("RUSTLER_PRECOMPILATION_EXAMPLE_BUILD") in ["1", "true"], - targets: - Enum.uniq(["aarch64-unknown-linux-gnu" | RustlerPrecompiled.Config.default_targets()]), - version: version - - @type session() :: reference() - @type publisher() :: reference() - - @spec zenoh_open :: session() | no_return() - def zenoh_open(), do: :erlang.nif_error("NIF zenoh_open is not implemented") - - @spec session_declare_publisher(session(), charlist()) :: {:ok, publisher()} - def session_declare_publisher(_session, _keyexpr), - do: :erlang.nif_error("NIF session_declare_publisher is not implemented") - - @spec publisher_put_string(publisher(), charlist()) :: no_return() - def publisher_put_string(_publisher, _value), - do: :erlang.nif_error("NIF publisher_put is not implemented") - - @spec publisher_put_integer(publisher(), charlist()) :: no_return() - def publisher_put_integer(_publisher, _value), - do: :erlang.nif_error("NIF publisher_put is not implemented") - - @spec publisher_put_float(publisher(), charlist()) :: no_return() - def publisher_put_float(_publisher, _value), - do: :erlang.nif_error("NIF publisher_put is not implemented") - - @spec tester_pub(charlist(), charlist()) :: no_return() - def tester_pub(_keyexpr, _value), do: :erlang.nif_error("NIF tester_pub is not implemented") - - @spec tester_sub(charlist()) :: no_return() - def tester_sub(_keyexpr), do: :erlang.nif_error("NIF tester_sub is not implemented") - - @spec session_declare_subscriber(session(), charlist(), pid()) :: no_return() - def session_declare_subscriber(_session, _keyexpr, _callbackpid), - do: :erlang.nif_error("NIF session_declare_subscriber is not implemented") - - @spec session_declare_subscriber_wrapper(session(), charlist(), function()) :: no_return() - def session_declare_subscriber_wrapper(session, keyexpr, callback) do - pid = spawn(NifZenoh, :wait_message, [callback]) - - session_declare_subscriber(session, keyexpr, pid) - end - - def wait_message(callback) do - receive do - msg -> callback.(msg) - end - - wait_message(callback) - end -end diff --git a/lib/publisher.ex b/lib/publisher.ex deleted file mode 100644 index 74e63c4..0000000 --- a/lib/publisher.ex +++ /dev/null @@ -1,11 +0,0 @@ -defmodule Publisher do - @spec put(NifZenoh.publisher(), any) :: none - def put(publisher, value) do - cond do - is_binary(value) -> NifZenoh.publisher_put_string(publisher, value) - is_float(value) -> NifZenoh.publisher_put_float(publisher, value) - is_integer(value) -> NifZenoh.publisher_put_integer(publisher, value) - true -> :error - end - end -end diff --git a/lib/session.ex b/lib/session.ex deleted file mode 100644 index 852808a..0000000 --- a/lib/session.ex +++ /dev/null @@ -1,11 +0,0 @@ -defmodule Session do - @spec declare_publisher(NifZenoh.session(), charlist()) :: {:ok, NifZenoh.publisher()} - def declare_publisher(session, key) do - NifZenoh.session_declare_publisher(session, key) - end - - @spec declare_subscriber(NifZenoh.session(), charlist(), function()) :: no_return() - def declare_subscriber(session, keyexpr, callback) do - NifZenoh.session_declare_subscriber_wrapper(session, keyexpr, callback) - end -end diff --git a/lib/tester.ex b/lib/tester.ex deleted file mode 100644 index 28ef626..0000000 --- a/lib/tester.ex +++ /dev/null @@ -1,11 +0,0 @@ -defmodule Tester do - @spec pub(charlist(), charlist()) :: no_return() - def pub(keyexpr, value) do - NifZenoh.tester_pub(keyexpr, value) - end - - @spec sub(charlist()) :: no_return() - def sub(keyexpr) do - NifZenoh.tester_sub(keyexpr) - end -end diff --git a/native/nifzenoh/.cargo/config.toml b/native/nifzenoh/.cargo/config.toml deleted file mode 100644 index b5d186c..0000000 --- a/native/nifzenoh/.cargo/config.toml +++ /dev/null @@ -1,14 +0,0 @@ -[target.'cfg(target_os = "macos")'] -rustflags = [ - "-C", "link-arg=-undefined", - "-C", "link-arg=dynamic_lookup", -] - -[target.x86_64-unknown-linux-musl] -rustflags = [ - "-C", "target-feature=-crt-static" -] - -# Provides a small build size, but takes more time to build. -[profile.release] -lto = true \ No newline at end of file diff --git a/native/nifzenoh/.gitignore b/native/nifzenoh/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/native/nifzenoh/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/native/nifzenoh/Cargo.lock b/native/nifzenoh/Cargo.lock deleted file mode 100644 index 2d23e88..0000000 --- a/native/nifzenoh/Cargo.lock +++ /dev/null @@ -1,3274 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "anstream" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd2405b3ac1faab2990b74d728624cd9fd115651fcecc7c2d8daf01376275ba" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" - -[[package]] -name = "anstyle-parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" - -[[package]] -name = "array-init" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" - -[[package]] -name = "async-attributes" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1da3ae8dabd9c00f453a329dfe1fb28da3c0a72e2478cdcd93171740c20499" -dependencies = [ - "async-lock", - "async-task", - "concurrent-queue", - "fastrand 2.0.1", - "futures-lite", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" -dependencies = [ - "async-channel", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", - "tokio", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite", - "log", - "parking", - "polling", - "rustix 0.37.23", - "slab", - "socket2 0.4.9", - "waker-fn", -] - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - -[[package]] -name = "async-process" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf012553ce51eb7aa6dc2143804cc8252bd1cb681a1c5cb7fa94ca88682dee1d" -dependencies = [ - "async-io", - "async-lock", - "async-signal", - "blocking", - "cfg-if", - "event-listener 3.0.0", - "futures-lite", - "rustix 0.38.14", - "windows-sys 0.48.0", -] - -[[package]] -name = "async-rustls" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd10f063fb367d26334e10c50c67ea31ac542b8c3402be2251db4cfc5d74ba66" -dependencies = [ - "futures-io", - "rustls", -] - -[[package]] -name = "async-signal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c99f3cb3f9ff89f7d718fbb942c9eb91bedff12e396adf09a622dfe7ffec2bc2" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "concurrent-queue", - "futures-core", - "futures-io", - "libc", - "signal-hook-registry", - "slab", - "windows-sys 0.48.0", -] - -[[package]] -name = "async-std" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" -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", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9441c6b2fe128a7c2bf680a44c34d0df31ce09e5b7e401fcca3faa483dbc921" - -[[package]] -name = "async-trait" -version = "0.1.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blocking" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94c4ef1f913d78636d78d538eec1f18de81e481f44b1be0a81060090530846e1" -dependencies = [ - "async-channel", - "async-lock", - "async-task", - "fastrand 2.0.1", - "futures-io", - "futures-lite", - "piper", - "tracing", -] - -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "cache-padded" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[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.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clap" -version = "4.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e54881c004cec7895b0068a0a954cd5d62da01aef83fa35b1e594497bf5445" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cb82d7f531603d2fd1f507441cdd35184fa81beff7bd489570de7f773460bb" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "clap_lex" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "concurrent-queue" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" - -[[package]] -name = "const_format" -version = "0.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c990efc7a285731f9a4378d81aff2f0e85a2c8781a05ef0f8baa8dac54d0ff48" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e026b6ce194a874cb9cf32cd5772d1ef9767cc8fcb5765948d74f37a9d8b2bf6" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "data-encoding" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dyn-clone" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" - -[[package]] -name = "env_logger" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e56284f00d94c1bc7fd3c77027b4623c88c1f53d8d2394c6199f2921dea325" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - -[[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 1.0.109", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad227c3af19d4914570ad36d30409928b75967c298feb9ea1969db3a610bb14e" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "ipnetwork" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" -dependencies = [ - "serde", -] - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix 0.38.14", - "windows-sys 0.48.0", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keyed-set" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79e110283e09081809ca488cf3a9709270c6d4d4c4a32674c39cc438366615a" -dependencies = [ - "hashbrown 0.13.2", -] - -[[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.148" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" - -[[package]] -name = "libloading" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" -dependencies = [ - "value-bag", -] - -[[package]] -name = "lz4_flex" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea9b256699eda7b0387ffbc776dd625e28bde3918446381781245b7a50349d8" -dependencies = [ - "twox-hash", -] - -[[package]] -name = "memchr" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - -[[package]] -name = "nifzenoh" -version = "0.1.5" -dependencies = [ - "async-std", - "clap", - "env_logger", - "flume", - "futures", - "rustler", - "zenoh", -] - -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.4.0", - "cfg-if", - "libc", -] - -[[package]] -name = "no-std-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" -dependencies = [ - "num-traits", -] - -[[package]] -name = "parking" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e52c774a4c39359c1d1c52e43f73dd91a75a614652c825408eec30c95a9b2067" - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pest" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35513f630d46400a977c4cb58f78e1bfbe01434316e60c37d27b9ad6139c66d8" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9fc1b9e7057baba189b5c626e2d6f40681ae5b6eb064dc7c7834101ec8123a" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "pest_meta" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df74e9e7ec4053ceb980e7c0c8bd3594e977fde1af91daba9c928e8e8c6708d" -dependencies = [ - "once_cell", - "pest", - "sha2", -] - -[[package]] -name = "petgraph" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" -dependencies = [ - "atomic-waker", - "fastrand 2.0.1", - "futures-io", -] - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pnet" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "130c5b738eeda2dc5796fe2671e49027e6935e817ab51b930a36ec9e6a206a64" -dependencies = [ - "ipnetwork", - "pnet_base", - "pnet_datalink", - "pnet_packet", - "pnet_sys", - "pnet_transport", -] - -[[package]] -name = "pnet_base" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cf6fb3ab38b68d01ab2aea03ed3d1132b4868fa4e06285f29f16da01c5f4c" -dependencies = [ - "no-std-net", -] - -[[package]] -name = "pnet_datalink" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad5854abf0067ebbd3967f7d45ebc8976ff577ff0c7bd101c4973ae3c70f98fe" -dependencies = [ - "ipnetwork", - "libc", - "pnet_base", - "pnet_sys", - "winapi", -] - -[[package]] -name = "pnet_macros" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688b17499eee04a0408aca0aa5cba5fc86401d7216de8a63fdf7a4c227871804" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.37", -] - -[[package]] -name = "pnet_macros_support" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea925b72f4bd37f8eab0f221bbe4c78b63498350c983ffa9dd4bcde7e030f56" -dependencies = [ - "pnet_base", -] - -[[package]] -name = "pnet_packet" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a005825396b7fe7a38a8e288dbc342d5034dac80c15212436424fef8ea90ba" -dependencies = [ - "glob", - "pnet_base", - "pnet_macros", - "pnet_macros_support", -] - -[[package]] -name = "pnet_sys" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417c0becd1b573f6d544f73671070b039051e5ad819cc64aa96377b536128d00" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "pnet_transport" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2637e14d7de974ee2f74393afccbc8704f3e54e6eb31488715e72481d1662cc3" -dependencies = [ - "libc", - "pnet_base", - "pnet_packet", - "pnet_sys", -] - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quinn" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c78e758510582acc40acb90458401172d41f1016f8c9dde89e49677afb7eec1" -dependencies = [ - "bytes", - "rand", - "ring 0.16.20", - "rustc-hash", - "rustls", - "rustls-native-certs 0.6.3", - "slab", - "thiserror", - "tinyvec", - "tracing", -] - -[[package]] -name = "quinn-udp" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" -dependencies = [ - "bytes", - "libc", - "socket2 0.5.4", - "tracing", - "windows-sys 0.48.0", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[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 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" -dependencies = [ - "cc", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys 0.48.0", -] - -[[package]] -name = "ringbuffer-spsc" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1938faa63a2362ee1747afb2d10567d0fb1413b9cbd6198a8541485c4f773" -dependencies = [ - "array-init", - "cache-padded", -] - -[[package]] -name = "rsa" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" -dependencies = [ - "byteorder", - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-iter", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.37.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys 0.4.7", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustler" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b4fea69e23de68c42c06769d6624d2d018da550c17244dd4b691f90ced4a7e" -dependencies = [ - "lazy_static", - "rustler_codegen", - "rustler_sys", -] - -[[package]] -name = "rustler_codegen" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406061bd07aaf052c344257afed4988c5ec8efe4d2352b4c2cf27ea7c8575b12" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "rustler_sys" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7c0740e5322b64e2b952d8f0edce5f90fcf6f6fe74cca3f6e78eb3de5ea858" -dependencies = [ - "regex", - "unreachable", -] - -[[package]] -name = "rustls" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" -dependencies = [ - "log", - "ring 0.16.20", - "rustls-webpki 0.101.6", - "sct", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.3", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.0.0", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64", -] - -[[package]] -name = "rustls-pemfile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" -dependencies = [ - "base64", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9d979b3ce68192e42760c7810125eb6cf2ea10efae545a156063e61f314e2a" - -[[package]] -name = "rustls-webpki" -version = "0.101.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4ca26037c909dedb327b48c3327d0ba91d3dd3c4e05dad328f210ffb68e95b" -dependencies = [ - "ring 0.17.7", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "schemars" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" -dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 1.0.109", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" - -[[package]] -name = "serde" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "serde_derive_internals" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_json" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest", - "keccak", -] - -[[package]] -name = "shellexpand" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" -dependencies = [ - "dirs", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[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.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "termcolor" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "token-cell" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a2b964fdb303b08a4eab04d7c1bad2bca33f8eee334ccd28802f1041c6eb87" -dependencies = [ - "paste", -] - -[[package]] -name = "tokio" -version = "1.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "pin-project-lite", - "socket2 0.5.4", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite", -] - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "twox-hash" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if", - "static_assertions", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - -[[package]] -name = "uhlc" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1eadef1fa26cbbae1276c46781e8f4d888bdda434779c18ae6c2a0e69991885" -dependencies = [ - "humantime", - "lazy_static", - "log", - "rand", - "serde", - "spin 0.9.8", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - -[[package]] -name = "unsafe-libyaml" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[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 1.0.109", -] - -[[package]] -name = "url" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" -dependencies = [ - "getrandom", -] - -[[package]] -name = "validated_struct" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feef04c049b4beae3037a2a31b8da40d8cebec0b97456f24c7de0ede4ed9efed" -dependencies = [ - "json5", - "serde", - "serde_json", - "validated_struct_macros", -] - -[[package]] -name = "validated_struct_macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d4444a980afa9ef0d29c2a3f4d952ec0495a7a996a9c78b52698b71bc21edb4" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unzip-n", -] - -[[package]] -name = "value-bag" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" - -[[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 = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "waker-fn" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" - -[[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.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.37", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de2cfda980f21be5a7ed2eadb3e6fe074d56022bea2cdeb1a62eb220fc04188" -dependencies = [ - "rustls-pki-types", -] - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" -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.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.0", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" -dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" - -[[package]] -name = "zenoh" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36b83f5835024bdeefd9079b4af86db316f7a3af94214734df34e098cececfd" -dependencies = [ - "async-global-executor", - "async-std", - "async-trait", - "base64", - "const_format", - "env_logger", - "event-listener 4.0.3", - "flume", - "form_urlencoded", - "futures", - "git-version", - "hex", - "lazy_static", - "log", - "ordered-float", - "paste", - "petgraph", - "rand", - "regex", - "rustc_version", - "serde", - "serde_json", - "socket2 0.5.4", - "stop-token", - "uhlc", - "uuid", - "vec_map", - "zenoh-buffers", - "zenoh-codec", - "zenoh-collections", - "zenoh-config", - "zenoh-core", - "zenoh-crypto", - "zenoh-link", - "zenoh-macros", - "zenoh-plugin-trait", - "zenoh-protocol", - "zenoh-result", - "zenoh-sync", - "zenoh-transport", - "zenoh-util", -] - -[[package]] -name = "zenoh-buffers" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e2261fe0052adb5ef062fde72cbe3e662f7516c8b824b1822484bf74405d9c" -dependencies = [ - "zenoh-collections", -] - -[[package]] -name = "zenoh-codec" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a216c47e82917a33ad52efa136f81dbdee2f7bd7d1c48b7aa064fedff33be9" -dependencies = [ - "log", - "serde", - "uhlc", - "zenoh-buffers", - "zenoh-protocol", -] - -[[package]] -name = "zenoh-collections" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "639c58788f591f8f80e9722d1c214c6d6c480ca9f90eeff29b8e929848f25241" - -[[package]] -name = "zenoh-config" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d36ec0bd12e9c3cbe60d4fb04dfd42485d404e886fd46fc096e45037507d721" -dependencies = [ - "flume", - "json5", - "num_cpus", - "secrecy", - "serde", - "serde_json", - "serde_yaml", - "validated_struct", - "zenoh-core", - "zenoh-protocol", - "zenoh-result", - "zenoh-util", -] - -[[package]] -name = "zenoh-core" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447f92480b131892c65b1958d362de4b0db28784cd0efa8c68ed0766ef5f3e4a" -dependencies = [ - "async-std", - "lazy_static", - "zenoh-result", -] - -[[package]] -name = "zenoh-crypto" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5defd1096ee882529e1596c5762cc91c43e6136c6a986dba5be653e1cab65329" -dependencies = [ - "aes", - "hmac", - "rand", - "rand_chacha", - "sha3", - "zenoh-result", -] - -[[package]] -name = "zenoh-keyexpr" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4934fbb00820a45eb360af6c01538607a5e01d4fc0da201338b376ce2329c91a" -dependencies = [ - "hashbrown 0.14.0", - "keyed-set", - "rand", - "schemars", - "serde", - "token-cell", - "zenoh-result", -] - -[[package]] -name = "zenoh-link" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853e37b4991941dba7ac0a0d18c6cefcc3faea06b504c24e6099595f23352587" -dependencies = [ - "async-std", - "async-trait", - "zenoh-config", - "zenoh-link-commons", - "zenoh-link-quic", - "zenoh-link-tcp", - "zenoh-link-tls", - "zenoh-link-udp", - "zenoh-link-unixsock_stream", - "zenoh-link-ws", - "zenoh-protocol", - "zenoh-result", -] - -[[package]] -name = "zenoh-link-commons" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ffdae930104183a86a5f888fa7bb02c8c08415c3f715e7d268cd09f5124e3a" -dependencies = [ - "async-std", - "async-trait", - "flume", - "lz4_flex", - "serde", - "typenum", - "zenoh-buffers", - "zenoh-codec", - "zenoh-protocol", - "zenoh-result", -] - -[[package]] -name = "zenoh-link-quic" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfa825958f9ed292d241f45e0ac29804790ec39eed57f1a262ffb481c6c2539e" -dependencies = [ - "async-rustls", - "async-std", - "async-trait", - "base64", - "futures", - "log", - "quinn", - "rustls", - "rustls-native-certs 0.7.0", - "rustls-pemfile 2.0.0", - "rustls-webpki 0.102.1", - "secrecy", - "zenoh-config", - "zenoh-core", - "zenoh-link-commons", - "zenoh-protocol", - "zenoh-result", - "zenoh-sync", - "zenoh-util", -] - -[[package]] -name = "zenoh-link-tcp" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e1b9908eecc9ccebbfc41992f82a177e8bd71aa0a70a22326794ede7e8b09d" -dependencies = [ - "async-std", - "async-trait", - "log", - "zenoh-core", - "zenoh-link-commons", - "zenoh-protocol", - "zenoh-result", - "zenoh-sync", - "zenoh-util", -] - -[[package]] -name = "zenoh-link-tls" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5bafb58c3841d19f0a1b07248c29c4a952cf9fd118a867034c0b6528a3ab5e" -dependencies = [ - "async-rustls", - "async-std", - "async-trait", - "base64", - "futures", - "log", - "rustls", - "rustls-pemfile 2.0.0", - "rustls-webpki 0.102.1", - "secrecy", - "webpki-roots", - "zenoh-config", - "zenoh-core", - "zenoh-link-commons", - "zenoh-protocol", - "zenoh-result", - "zenoh-sync", - "zenoh-util", -] - -[[package]] -name = "zenoh-link-udp" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540459645821cc63c9aebd6d405509adfec0f5584673f9551de26004ff3ddbff" -dependencies = [ - "async-std", - "async-trait", - "log", - "socket2 0.5.4", - "zenoh-buffers", - "zenoh-collections", - "zenoh-core", - "zenoh-link-commons", - "zenoh-protocol", - "zenoh-result", - "zenoh-sync", - "zenoh-util", -] - -[[package]] -name = "zenoh-link-unixsock_stream" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d281e37dfc0c0ca3bace54dec15bdfd5b12b3cb4a01593e71e1a4ef59e48b57c" -dependencies = [ - "async-std", - "async-trait", - "futures", - "log", - "nix", - "uuid", - "zenoh-core", - "zenoh-link-commons", - "zenoh-protocol", - "zenoh-result", - "zenoh-sync", -] - -[[package]] -name = "zenoh-link-ws" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "766663fc1e96c382e59eb009f751744a6967bf76537e1091584382722a5d9d50" -dependencies = [ - "async-std", - "async-trait", - "futures-util", - "log", - "tokio", - "tokio-tungstenite", - "url", - "zenoh-core", - "zenoh-link-commons", - "zenoh-protocol", - "zenoh-result", - "zenoh-sync", - "zenoh-util", -] - -[[package]] -name = "zenoh-macros" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2826db61e1526dea78371a1cdf7ce7b933fd390abfbec1eff07b22262cebc4f8" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.37", - "unzip-n", - "zenoh-keyexpr", -] - -[[package]] -name = "zenoh-plugin-trait" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45fd679f3fdf661ef914ebf4ed8210357bfa7144411f8fdbb18199a903d6270" -dependencies = [ - "libloading", - "log", - "serde_json", - "zenoh-macros", - "zenoh-result", - "zenoh-util", -] - -[[package]] -name = "zenoh-protocol" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4af91145a94f60b9165e85b0ac6fa84e2f0448f9cde3e3065f6e73bb5b2ef3c" -dependencies = [ - "const_format", - "hex", - "rand", - "serde", - "uhlc", - "uuid", - "zenoh-buffers", - "zenoh-keyexpr", - "zenoh-result", -] - -[[package]] -name = "zenoh-result" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3b5209dc13bf96dc62921a389af38e757fb0baea54f2078e29636d2238e958" -dependencies = [ - "anyhow", -] - -[[package]] -name = "zenoh-sync" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f515dae61f3216a4c5ed9229fcaa9fb6f5837622f56e94c7454141bfba844b69" -dependencies = [ - "async-std", - "event-listener 4.0.3", - "flume", - "futures", - "tokio", - "zenoh-buffers", - "zenoh-collections", - "zenoh-core", -] - -[[package]] -name = "zenoh-transport" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a888646bbaa18c0901081207eab56200ec13bcaec7b5629b9389ee3255eab6" -dependencies = [ - "async-executor", - "async-global-executor", - "async-std", - "async-trait", - "flume", - "log", - "lz4_flex", - "paste", - "rand", - "ringbuffer-spsc", - "rsa", - "serde", - "sha3", - "zenoh-buffers", - "zenoh-codec", - "zenoh-collections", - "zenoh-config", - "zenoh-core", - "zenoh-crypto", - "zenoh-link", - "zenoh-protocol", - "zenoh-result", - "zenoh-sync", - "zenoh-util", -] - -[[package]] -name = "zenoh-util" -version = "0.10.1-rc" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e867296dc177ca7d5870f76374153cc30087ef0ba9914f567addf52e05d2259" -dependencies = [ - "async-std", - "async-trait", - "clap", - "const_format", - "flume", - "futures", - "hex", - "home", - "humantime", - "lazy_static", - "libc", - "libloading", - "log", - "pnet", - "pnet_datalink", - "shellexpand", - "winapi", - "zenoh-core", - "zenoh-protocol", - "zenoh-result", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/native/nifzenoh/Cargo.toml b/native/nifzenoh/Cargo.toml deleted file mode 100644 index 8dae30d..0000000 --- a/native/nifzenoh/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "nifzenoh" -version = "0.1.5" -authors = [] -edition = "2018" - -[lib] -name = "nifzenoh" -path = "src/lib.rs" -crate-type = ["cdylib"] - -[dependencies] -rustler = "0.30.0" -zenoh = { version = "0.10.1-rc", default-features = true } -async-std = { version = "=1.12.0", default-features = false, features = [ - "attributes", -] } -env_logger = "0.10.1" -clap = "4.4.16" -futures = "0.3.30" -flume = "0.11.0" diff --git a/native/nifzenoh/Cross.toml b/native/nifzenoh/Cross.toml deleted file mode 100644 index ea92ea7..0000000 --- a/native/nifzenoh/Cross.toml +++ /dev/null @@ -1,4 +0,0 @@ -[build.env] -passthrough = [ - "RUSTLER_NIF_VERSION" -] \ No newline at end of file diff --git a/native/nifzenoh/README.md b/native/nifzenoh/README.md deleted file mode 100644 index a5a73dc..0000000 --- a/native/nifzenoh/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# NIF for Elixir.NifZenoh - -## To build the NIF module: - -- Your NIF will now build along with your project. - -## To load the NIF: - -```elixir -defmodule NifZenoh do - use Rustler, otp_app: :zenohex, crate: "nifzenoh" - - # When your NIF is loaded, it will override this function. - def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) -end -``` - -## Examples - -[This](https://github.com/rusterlium/NifIo) is a complete example of a NIF written in Rust. diff --git a/native/nifzenoh/src/lib.rs b/native/nifzenoh/src/lib.rs deleted file mode 100644 index 860576a..0000000 --- a/native/nifzenoh/src/lib.rs +++ /dev/null @@ -1,119 +0,0 @@ -use futures::executor::block_on; -use rustler::types::atom::ok; -use rustler::types::{Encoder, Pid}; -use rustler::{Env, OwnedEnv, ResourceArc, Term}; -use std::sync::Mutex; -use zenoh::config::Config; -use zenoh::prelude::r#async::*; -use zenoh::publication::Publisher; -pub mod tester; -use tester::tester::{tester_pub, tester_sub}; - -struct SessionContainer { - session_mux: Mutex<&'static Session>, -} - -struct PublisherContainer { - publisher_mux: Mutex>, -} - -fn load<'a>(env: Env<'a>, _: Term<'a>) -> bool { - rustler::resource!(SessionContainer, env); - rustler::resource!(PublisherContainer, env); - true -} - -#[rustler::nif] -fn zenoh_open<'a>() -> ResourceArc { - ResourceArc::new(SessionContainer { - session_mux: Mutex::new(Session::leak( - block_on(zenoh::open(Config::default()).res()).unwrap(), - )), - }) -} - -#[rustler::nif] -fn session_declare_publisher<'a>( - env: Env<'a>, - resource_session: ResourceArc, - keyexpr: String, -) -> Term<'a> { - let session = resource_session.session_mux.lock().unwrap(); - let publisher = session.declare_publisher(keyexpr); - let resource_publisher = ResourceArc::new(PublisherContainer { - publisher_mux: Mutex::new(block_on(publisher.res()).unwrap()), - }); - (ok(), resource_publisher).encode(env) -} - -fn publisher_put<'a>( - env: Env<'a>, - resource_session: ResourceArc, - value: Value, -) -> Term<'a> { - let publisher = &resource_session.publisher_mux.lock().unwrap(); - block_on(publisher.put(value).res()).unwrap(); - (ok()).encode(env) -} - -#[rustler::nif] -fn publisher_put_string<'a>( - env: Env<'a>, - resource_session: ResourceArc, - value: String, -) -> Term<'a> { - publisher_put(env, resource_session, Value::from(value)) -} - -#[rustler::nif] -fn publisher_put_integer<'a>( - env: Env<'a>, - resource_session: ResourceArc, - value: i64, -) -> Term<'a> { - publisher_put(env, resource_session, Value::from(value)) -} - -#[rustler::nif] -fn publisher_put_float<'a>( - env: Env<'a>, - resource_session: ResourceArc, - value: f64, -) -> Term<'a> { - publisher_put(env, resource_session, Value::from(value)) -} - -#[rustler::nif] -fn session_declare_subscriber<'a>( - env: Env<'a>, - resource_session: ResourceArc, - keyexpr: String, - pid: Pid, -) -> Term<'a> { - let mut subscriber_env = OwnedEnv::new(); - - let session = resource_session.session_mux.lock().unwrap(); - let subscriber = block_on(session.declare_subscriber(keyexpr).res()).unwrap(); - - std::thread::spawn(move || loop { - let sample = block_on(subscriber.recv_async()).unwrap(); - subscriber_env.send_and_clear(&pid, |env| sample.value.to_string().encode(env)); - }); - - ok().encode(env) -} - -rustler::init!( - "Elixir.NifZenoh", - [ - zenoh_open, - session_declare_publisher, - publisher_put_string, - publisher_put_float, - publisher_put_integer, - tester_pub, - tester_sub, - session_declare_subscriber, - ], - load = load -); diff --git a/native/nifzenoh/src/tester.rs b/native/nifzenoh/src/tester.rs deleted file mode 100644 index cc0ee89..0000000 --- a/native/nifzenoh/src/tester.rs +++ /dev/null @@ -1,63 +0,0 @@ -pub mod tester { - use async_std::task::sleep; - use futures::executor::block_on; - use futures::prelude::*; - use futures::select; - use std::time::Duration; - use zenoh::config::Config; - use zenoh::prelude::r#async::*; - - pub async fn pub_zenoh(key_expr: String, value: String) { - env_logger::init(); - - let session = zenoh::open(Config::default()).res().await.unwrap(); - println!("Declaring Publisher on '{}'...", key_expr); - let publisher = session.declare_publisher(&key_expr).res().await.unwrap(); - - for idx in 0..u32::MAX { - sleep(Duration::from_secs(1)).await; - let buf = format!("[{:4}] {}", idx, value); - println!("Putting Data ('{}': '{}')...", &key_expr, buf); - publisher.put(buf).res().await.unwrap(); - } - } - - pub async fn sub_zenoh(key_expr: String) { - env_logger::init(); - - println!("Opening session..."); - let session = zenoh::open(Config::default()).res().await.unwrap(); - - println!("Declaring Subscriber on '{}'...", &key_expr); - let subscriber = session.declare_subscriber(&key_expr).res().await.unwrap(); - - println!("Enter 'q' to quit..."); - let mut stdin = async_std::io::stdin(); - let mut input = [0_u8]; - loop { - select!( - sample = subscriber.recv_async() => { - let sample = sample.unwrap(); - println!(">> [Subscriber] Received {} ('{}': '{}')", - sample.kind, sample.key_expr.as_str(), sample.value); - }, - - _ = stdin.read_exact(&mut input).fuse() => { - match input[0] { - b'q' => break, - 0 => sleep(Duration::from_secs(1)).await, - _ => (), - } - } - ); - } - } - #[rustler::nif] - fn tester_pub(key_expr: String, value: String) { - block_on(pub_zenoh(key_expr, value)); - } - #[rustler::nif] - pub fn tester_sub(key_exprt: String) { - block_on(sub_zenoh(key_exprt)); - } -} From 1fcc0b397bd379ccbd8597efaba3b314db138d49 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 11:33:06 +0900 Subject: [PATCH 039/165] Update mix.exs --- mix.exs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index 42d001b..cbd16b3 100644 --- a/mix.exs +++ b/mix.exs @@ -39,9 +39,11 @@ defmodule Zenohex.MixProject do name: "zenohex", files: [ "lib", - "native/nifzenoh/.cargo", - "native/nifzenoh/src", - "native/nifzenoh/Cargo*", + "native/zenohex_nif/.cargo", + "native/zenohex_nif/src", + "native/zenohex_nif/Cargo*", + "LICENSE", + "README.md", "checksum-*.exs", "mix.exs" ], From 211b5cea58631c63f9a5a6478ae3cbd567d6192e Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 11:33:55 +0900 Subject: [PATCH 040/165] Update README.md --- README.md | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 9c58ad4..474952f 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ Zenohex is the [zenoh](https://zenoh.io/) client library for elixir. -Currently zenohex uses version 0.10.1-rc of zenoh. -If you want to communicate with Rust version of Zenoh, please use the same version. +**Currently zenohex uses version 0.10.1-rc of zenoh. +If you want to communicate with other Zenoh clients or routers, please use the same version.** ## Installation @@ -27,40 +27,36 @@ and published on [HexDocs](https://hexdocs.pm). Once published, the docs can be found at . ### Install rust (Optional) + Since version 0.1.3, Zenohex uses rustler precompiled and does not require Rust to be installed. -If you need to build rust NIFs code, please set the environment variable and install rust. -``` -export RUSTLER_PRECOMPILATION_EXAMPLE_BUILD=1 +If you want to build rust NIFs code, please add following to your config file. + +```elixir +config :rustler_precompiled, :force_build, zenohex: true ``` + https://www.rust-lang.org/tools/install ## Getting Started -### Publisher example -#### terminal 1 (Subscriber) -``` -iex -S mix -iex> NifZenoh.tester_sub "demo/example/zenoh-rs-pub" -``` +### Pub/Sub example -#### terminal 2 (Publisher) -``` -iex -S mix -iex> session = Zenohex.open -iex> {:ok, publisher} = Session.declare_publisher(session, "demo/example/zenoh-rs-pub") -iex> Publisher.put(publisher, "Hello zenoh?") +```sh +$ iex -S mix ``` -### Subscriber example -``` -(Subscriber) -iex -S mix -iex> session = Zenohex.open -iex> Session.declare_subscriber(session, "demo/example/zenoh-rs-pub", fn m -> IO.inspect(m) end) -(third argument is callback function) - -(Publisher) -iex> {:ok, publisher} = Session.declare_publisher(session, "demo/example/zenoh-rs-pub") -iex> Publisher.put(publisher, "Hello zenoh?") +```elixir +iex(1)> session = Zenohex.open!() +#Reference<> +iex(2)> publisher = Zenohex.Session.declare_publisher!(session, "pub/sub") +#Reference<> +iex(3)> subscriber = Zenohex.Session.declare_subscriber!(session, "pub/sub") +#Reference<> +iex(4)> Zenohex.Publisher.put!(publisher, "Hello Zenoh Dragon") +:ok +iex(5)> Zenohex.Subscriber.recv_timeout!(subscriber, 1000) +"Hello Zenoh Dragon" +iex(6)> Zenohex.Subscriber.recv_timeout!(subscriber, 1000) +:timeout ``` From 62d020c2e17499e5853720a3f5ab97883e8e6a4d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 11:34:10 +0900 Subject: [PATCH 041/165] Change dev version from 0.2.0-dev to 0.2.0-dev.0 --- mix.exs | 2 +- native/zenohex_nif/Cargo.lock | 2 +- native/zenohex_nif/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index cbd16b3..6c544b1 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Zenohex.MixProject do use Mix.Project - @version "0.2.0-dev" + @version "0.2.0-dev.0" def project do [ diff --git a/native/zenohex_nif/Cargo.lock b/native/zenohex_nif/Cargo.lock index e6a1038..9e507e5 100644 --- a/native/zenohex_nif/Cargo.lock +++ b/native/zenohex_nif/Cargo.lock @@ -3322,7 +3322,7 @@ dependencies = [ [[package]] name = "zenohex_nif" -version = "0.2.0-dev" +version = "0.2.0-dev.0" dependencies = [ "flume", "futures", diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml index a7d32f6..e4cca41 100644 --- a/native/zenohex_nif/Cargo.toml +++ b/native/zenohex_nif/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zenohex_nif" -version = "0.2.0-dev" +version = "0.2.0-dev.0" authors = [] edition = "2021" From 3e20e172c9a5f41b3d10912c40acf1f530979a4a Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 12:15:32 +0900 Subject: [PATCH 042/165] Update mix.exs --- mix.exs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 6c544b1..43147eb 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,8 @@ defmodule Zenohex.MixProject do use Mix.Project + @version "0.2.0-dev.0" + @source_url "https://github.com/b5g-ex/zenohex" def project do [ @@ -10,7 +12,11 @@ defmodule Zenohex.MixProject do description: "Zenoh client library for elixir.", package: package(), start_permanent: Mix.env() == :prod, - deps: deps() + deps: deps(), + # Docs + name: "ZenohEx", + source_url: @source_url, + docs: docs() ] end @@ -49,7 +55,11 @@ defmodule Zenohex.MixProject do ], maintainers: ["s-hosoai"], licenses: ["MIT"], - links: %{"GitHub" => "https://github.com/b5g-ex/zenohex"} + links: %{"GitHub" => @source_url} ] end + + defp docs() do + [extras: ["README.md", "LICENSE"], main: "readme"] + end end From e5c613d8dc876005dc5ff06c3de90d02a78cbff8 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 14:31:29 +0900 Subject: [PATCH 043/165] Add config.exs --- config/config.exs | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 config/config.exs diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..51e395f --- /dev/null +++ b/config/config.exs @@ -0,0 +1,3 @@ +import Config + +config :rustler_precompiled, :force_build, zenohex: true From bb562344defabb62a0b3574c7a76894f0e6dd6b0 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 14:32:04 +0900 Subject: [PATCH 044/165] Change version from 0.2.0-dev.0 to 0.2.0-rc.0 --- mix.exs | 2 +- native/zenohex_nif/Cargo.lock | 2 +- native/zenohex_nif/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index 43147eb..40c45c3 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Zenohex.MixProject do use Mix.Project - @version "0.2.0-dev.0" + @version "0.2.0-rc.0" @source_url "https://github.com/b5g-ex/zenohex" def project do diff --git a/native/zenohex_nif/Cargo.lock b/native/zenohex_nif/Cargo.lock index 9e507e5..4edaa1c 100644 --- a/native/zenohex_nif/Cargo.lock +++ b/native/zenohex_nif/Cargo.lock @@ -3322,7 +3322,7 @@ dependencies = [ [[package]] name = "zenohex_nif" -version = "0.2.0-dev.0" +version = "0.2.0-rc.0" dependencies = [ "flume", "futures", diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml index e4cca41..bcd3c24 100644 --- a/native/zenohex_nif/Cargo.toml +++ b/native/zenohex_nif/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zenohex_nif" -version = "0.2.0-dev.0" +version = "0.2.0-rc.0" authors = [] edition = "2021" From 80e2b2e96a96b66bde3b754f9d0c1942c104b46d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 15:02:46 +0900 Subject: [PATCH 045/165] Add targets to .github/workflows/nif_precompile.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WHY: riscv64gc-unknown-linux-gnu をターゲットに含めない Zenoh が依存する ring v0.16.20 が対応していないため --- .github/workflows/nif_precompile.yml | 9 +++++---- lib/zenohex/nif.ex | 5 ++++- native/zenohex_nif/.cargo/config.toml | 5 +++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/nif_precompile.yml b/.github/workflows/nif_precompile.yml index 16e7014..ed9746f 100644 --- a/.github/workflows/nif_precompile.yml +++ b/.github/workflows/nif_precompile.yml @@ -14,14 +14,15 @@ jobs: matrix: nif: ["2.15"] job: - - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04 , use-cross: true } - - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04 , use-cross: true } - { target: aarch64-apple-darwin , os: macos-11 } + - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04 , use-cross: true } + - { target: aarch64-unknown-linux-musl , os: ubuntu-20.04 , use-cross: true } + - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04 , use-cross: true } - { target: x86_64-apple-darwin , os: macos-11 } - - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 } - - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04 , use-cross: true } - { target: x86_64-pc-windows-gnu , os: windows-2019 } - { target: x86_64-pc-windows-msvc , os: windows-2019 } + - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 } + - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04 , use-cross: true } steps: - name: Checkout source code diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 83cdd14..bc1524b 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -9,7 +9,10 @@ defmodule Zenohex.Nif do otp_app: :zenohex, crate: "zenohex_nif", version: version, - base_url: "#{github_url}/releases/download/v#{version}" + base_url: "#{github_url}/releases/download/v#{version}", + targets: + RustlerPrecompiled.Config.default_targets() + |> Enum.reject(&(&1 == "riscv64gc-unknown-linux-gnu")) alias Zenohex.Publisher alias Zenohex.Subscriber diff --git a/native/zenohex_nif/.cargo/config.toml b/native/zenohex_nif/.cargo/config.toml index 5158329..6a4c852 100644 --- a/native/zenohex_nif/.cargo/config.toml +++ b/native/zenohex_nif/.cargo/config.toml @@ -10,6 +10,11 @@ rustflags = [ "-C", "target-feature=-crt-static" ] +[target.aarch64-unknown-linux-musl] +rustflags = [ + "-C", "target-feature=-crt-static" +] + # Provides a small build size, but takes more time to build. [profile.release] lto = true From 5b401d188c08534c9c617912518336ff1c92473b Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 15:05:18 +0900 Subject: [PATCH 046/165] Bump version from 0.2.0-rc.0 to 0.2.0-rc.1 --- mix.exs | 2 +- native/zenohex_nif/Cargo.lock | 2 +- native/zenohex_nif/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index 40c45c3..70df1c7 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Zenohex.MixProject do use Mix.Project - @version "0.2.0-rc.0" + @version "0.2.0-rc.1" @source_url "https://github.com/b5g-ex/zenohex" def project do diff --git a/native/zenohex_nif/Cargo.lock b/native/zenohex_nif/Cargo.lock index 4edaa1c..ce6e395 100644 --- a/native/zenohex_nif/Cargo.lock +++ b/native/zenohex_nif/Cargo.lock @@ -3322,7 +3322,7 @@ dependencies = [ [[package]] name = "zenohex_nif" -version = "0.2.0-rc.0" +version = "0.2.0-rc.1" dependencies = [ "flume", "futures", diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml index bcd3c24..7918c17 100644 --- a/native/zenohex_nif/Cargo.toml +++ b/native/zenohex_nif/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zenohex_nif" -version = "0.2.0-rc.0" +version = "0.2.0-rc.1" authors = [] edition = "2021" From 737ae553b0a21d2609af1d42a8cd5913580d6cb6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 15:46:54 +0900 Subject: [PATCH 047/165] Add checksum-Elixir.Zenohex.Nif.exs for v0.2.0-rc.1 --- checksum-Elixir.Zenohex.Nif.exs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 checksum-Elixir.Zenohex.Nif.exs diff --git a/checksum-Elixir.Zenohex.Nif.exs b/checksum-Elixir.Zenohex.Nif.exs new file mode 100644 index 0000000..aab9cbd --- /dev/null +++ b/checksum-Elixir.Zenohex.Nif.exs @@ -0,0 +1,11 @@ +%{ + "libzenohex_nif-v0.2.0-rc.1-nif-2.15-aarch64-apple-darwin.so.tar.gz" => "sha256:7877bc6913c252485ed10bbd6e4081b8f74be84dd8f251e3bf40b767871ea3da", + "libzenohex_nif-v0.2.0-rc.1-nif-2.15-aarch64-unknown-linux-gnu.so.tar.gz" => "sha256:9353f1943337976731ab1111f3df524510fc990217a39989714dc0b56a813880", + "libzenohex_nif-v0.2.0-rc.1-nif-2.15-aarch64-unknown-linux-musl.so.tar.gz" => "sha256:3ab203d686436f0d935907dd80fe035890c3f692fc94b1a8d03536d88f9a6f61", + "libzenohex_nif-v0.2.0-rc.1-nif-2.15-arm-unknown-linux-gnueabihf.so.tar.gz" => "sha256:b1406f2bc2cda6df768432c700d1bb571dd6ca2b85584af4cc88d17dd4cbaa96", + "libzenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-apple-darwin.so.tar.gz" => "sha256:4fdcaac50d65e6d069fde911b25e30c04aff4c8c8fd69917906a870db47814e3", + "libzenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-unknown-linux-gnu.so.tar.gz" => "sha256:32bc5b176bb81b384265f061e4953fd0b265dc6cc2219897962689059a1f8c6e", + "libzenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-unknown-linux-musl.so.tar.gz" => "sha256:0c306e0b3a4cb790a7f99037c2925ea76efebf254ab7d9a238820097c68b95ce", + "zenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-pc-windows-gnu.dll.tar.gz" => "sha256:32d156d75f8815338dfd0ff0664eef43030b5469c505fd741e14b1d2b9c14eca", + "zenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-pc-windows-msvc.dll.tar.gz" => "sha256:81c7fec9f38006f74843230ae82d9a6895912e7b1353261e06c781ea9f87174b", +} From d667ff43eaedcd14e0c6af9dc208b5a6e7ec37f3 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 15:53:13 +0900 Subject: [PATCH 048/165] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 474952f..c838573 100644 --- a/README.md +++ b/README.md @@ -60,3 +60,9 @@ iex(5)> Zenohex.Subscriber.recv_timeout!(subscriber, 1000) iex(6)> Zenohex.Subscriber.recv_timeout!(subscriber, 1000) :timeout ``` + +## For developer + +### How to release + +Follow [Recommended flow](https://hexdocs.pm/rustler_precompiled/precompilation_guide.html#recommended-flow). From cb34befeb2a279960d00b71805e423d9916c4001 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 16:25:28 +0900 Subject: [PATCH 049/165] [zenohex_nif] Update nif.ex --- lib/zenohex/nif.ex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index bc1524b..18e3c85 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -14,6 +14,9 @@ defmodule Zenohex.Nif do RustlerPrecompiled.Config.default_targets() |> Enum.reject(&(&1 == "riscv64gc-unknown-linux-gnu")) + # for Nerves + @compile {:autoload, false} + alias Zenohex.Publisher alias Zenohex.Subscriber alias Zenohex.Queryable From eb11dedc8f87f14685757ea4d7a3cfd8b1fb646d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 30 Jan 2024 16:32:35 +0900 Subject: [PATCH 050/165] Update README.md, fix wrong link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c838573..8baf9f9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Zenohex [![Hex version](https://img.shields.io/hexpm/v/zenohex.svg "Hex version")](https://hex.pm/packages/zenohex) -[![API docs](https://img.shields.io/hexpm/v/rclex.svg?label=hexdocs "API docs")](https://hexdocs.pm/zenohex/) +[![API docs](https://img.shields.io/hexpm/v/zenohex.svg?label=hexdocs "API docs")](https://hexdocs.pm/zenohex/) [![License](https://img.shields.io/hexpm/l/zenohex.svg)](https://github.com/zenohex/zenohex/blob/main/LICENSE) Zenohex is the [zenoh](https://zenoh.io/) client library for elixir. From d5b6030626671e742ba08694339183f406391df6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 31 Jan 2024 14:44:26 +0900 Subject: [PATCH 051/165] Reduce testing time, fix #11 This fix reference is https://github.com/eclipse-zenoh/zenoh/issues/460#issuecomment-1508818164 --- lib/zenohex.ex | 6 +++++- lib/zenohex/nif.ex | 4 ++++ mix.exs | 20 +++++++++++++++++++- native/zenohex_nif/src/lib.rs | 13 +++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/lib/zenohex.ex b/lib/zenohex.ex index 3c97c97..4cd2737 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -15,6 +15,10 @@ defmodule Zenohex do """ @spec open! :: Session.t() def open!() do - Nif.zenoh_open() + if System.get_env("SCOUTING_DELAY") == "0" do + Nif.zenoh_scouting_delay_zero_session() + else + Nif.zenoh_open() + end end end diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 18e3c85..dd4139b 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -32,6 +32,10 @@ defmodule Zenohex.Nif do :erlang.nif_error(:nif_not_loaded) end + def zenoh_scouting_delay_zero_session() do + :erlang.nif_error(:nif_not_loaded) + end + for type <- ["integer", "float", "binary"] do def unquote(:"session_put_#{type}")(_session, _key_expr, _value) do :erlang.nif_error(:nif_not_loaded) diff --git a/mix.exs b/mix.exs index 70df1c7..465a8c7 100644 --- a/mix.exs +++ b/mix.exs @@ -16,7 +16,8 @@ defmodule Zenohex.MixProject do # Docs name: "ZenohEx", source_url: @source_url, - docs: docs() + docs: docs(), + aliases: [test: [&disable_zenoh_delay/1, "test"]] ] end @@ -62,4 +63,21 @@ defmodule Zenohex.MixProject do defp docs() do [extras: ["README.md", "LICENSE"], main: "readme"] end + + defp disable_zenoh_delay(_args) do + :ok = + """ + ================================================================= + HEY, ZENOHEX DEVELOPER. TO REDUCE TESTING TIME, + WE COMPILE WITH API_OPEN_SESSION_DELAY=0 AND SET SCOUTING DELAY 0 + ================================================================= + """ + |> String.trim_trailing() + |> Mix.shell().info() + + :ok = System.put_env("API_OPEN_SESSION_DELAY", "0") + :ok = System.put_env("SCOUTING_DELAY", "0") + + Mix.Task.run("compile", ["--force"]) + end end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index e3ce719..b6b8078 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -49,6 +49,18 @@ fn zenoh_open() -> ResourceArc { ResourceArc::new(ExSessionRef(session.into_arc())) } +#[rustler::nif] +fn zenoh_scouting_delay_zero_session() -> ResourceArc { + let mut config = config::peer(); + config + .scouting + .set_delay(Some(0)) + .expect("set_delay failed"); + + let session: Session = zenoh::open(config).res_sync().expect("zenoh_open failed"); + ResourceArc::new(ExSessionRef(session.into_arc())) +} + #[rustler::nif] fn declare_publisher( resource: ResourceArc, @@ -172,6 +184,7 @@ rustler::init!( add, test_thread, zenoh_open, + zenoh_scouting_delay_zero_session, declare_publisher, declare_subscriber, declare_pull_subscriber, From 294a39495374464a4be2772cc82152c30bdea4f8 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 31 Jan 2024 14:52:22 +0900 Subject: [PATCH 052/165] Update .github/workflows/ci.yaml --- .github/workflows/ci.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3a99783..1ec7b6a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,9 +33,6 @@ jobs: - name: get deps run: mix do deps.get, deps.compile - - name: compile - run: mix compile - - name: format run: mix format --check-formatted @@ -43,5 +40,5 @@ jobs: working-directory: native/zenohex_nif run: cargo fmt --all -- --check - - name: test + - name: compile & test run: mix test --warnings-as-errors From 0e26b006f20742affca5ea36b0980cd14738bf79 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 31 Jan 2024 21:46:44 +0900 Subject: [PATCH 053/165] Change API follow https://hexdocs.pm/elixir/main/design-anti-patterns.html#exceptions-for-control-flow --- README.md | 22 +++--- lib/zenohex.ex | 6 +- lib/zenohex/publisher.ex | 50 +++++++------ lib/zenohex/pull_subscriber.ex | 25 ++++--- lib/zenohex/session.ex | 78 ++++++++++---------- lib/zenohex/subscriber.ex | 15 ++-- native/zenohex_nif/src/lib.rs | 88 ++++++++++++----------- native/zenohex_nif/src/publisher.rs | 41 ++++++----- native/zenohex_nif/src/pull_subscriber.rs | 19 +++-- native/zenohex_nif/src/session.rs | 74 +++++++++---------- native/zenohex_nif/src/subscriber.rs | 6 +- test/zenohex/nif_test.exs | 65 +++++++++-------- test/zenohex_test.exs | 12 ++-- 13 files changed, 265 insertions(+), 236 deletions(-) diff --git a/README.md b/README.md index 8baf9f9..d7e1d2d 100644 --- a/README.md +++ b/README.md @@ -47,18 +47,18 @@ $ iex -S mix ``` ```elixir -iex(1)> session = Zenohex.open!() -#Reference<> -iex(2)> publisher = Zenohex.Session.declare_publisher!(session, "pub/sub") -#Reference<> -iex(3)> subscriber = Zenohex.Session.declare_subscriber!(session, "pub/sub") -#Reference<> -iex(4)> Zenohex.Publisher.put!(publisher, "Hello Zenoh Dragon") +iex(1)> {:ok, session} = Zenohex.open() +{:ok, #Reference<>} +iex(2)> {:ok, publisher} = Zenohex.Session.declare_publisher(session, "pub/sub") +{:ok, #Reference<>} +iex(3)> {:ok, subscriber} = Zenohex.Session.declare_subscriber(session, "pub/sub") +{:ok, #Reference<>} +iex(4)> Zenohex.Publisher.put(publisher, "Hello Zenoh Dragon") :ok -iex(5)> Zenohex.Subscriber.recv_timeout!(subscriber, 1000) -"Hello Zenoh Dragon" -iex(6)> Zenohex.Subscriber.recv_timeout!(subscriber, 1000) -:timeout +iex(5)> Zenohex.Subscriber.recv_timeout(subscriber, 1000) +{:ok, "Hello Zenoh Dragon"} +iex(6)> Zenohex.Subscriber.recv_timeout(subscriber, 1000) +{:error, :timeout} ``` ## For developer diff --git a/lib/zenohex.ex b/lib/zenohex.ex index 4cd2737..fb9b9a8 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -11,10 +11,10 @@ defmodule Zenohex do ## Examples - iex> Zenohex.open!() + iex> Zenohex.open() """ - @spec open! :: Session.t() - def open!() do + @spec open :: {:ok, Session.t()} | {:error, reason :: String.t()} + def open() do if System.get_env("SCOUTING_DELAY") == "0" do Nif.zenoh_scouting_delay_zero_session() else diff --git a/lib/zenohex/publisher.ex b/lib/zenohex/publisher.ex index 4da4212..c2c7aa3 100644 --- a/lib/zenohex/publisher.ex +++ b/lib/zenohex/publisher.ex @@ -31,24 +31,22 @@ defmodule Zenohex.Publisher do ## Examples - iex> session = Zenohex.open!() - iex> publisher = Zenohex.Session.declare_publisher!(session, "key/expression") - iex> :ok = Zenohex.Publisher.put!(publisher, "value") - iex> :ok = Zenohex.Publisher.put!(publisher, 0) - iex> :ok = Zenohex.Publisher.put!(publisher, 0.0) + iex> {:ok, session} = Zenohex.open() + iex> {:ok, publisher} = Zenohex.Session.declare_publisher(session, "key/expression") + iex> :ok = Zenohex.Publisher.put(publisher, "value") + iex> :ok = Zenohex.Publisher.put(publisher, 0) + iex> :ok = Zenohex.Publisher.put(publisher, 0.0) """ - @spec put!(t(), binary()) :: :ok - def put!(publisher, value) when is_binary(value) do + @spec put(t(), binary() | integer() | float()) :: :ok | {:error, reason :: String.t()} + def put(publisher, value) when is_binary(value) do Nif.publisher_put_binary(publisher, value) end - @spec put!(t(), integer()) :: :ok - def put!(publisher, value) when is_integer(value) do + def put(publisher, value) when is_integer(value) do Nif.publisher_put_integer(publisher, value) end - @spec put!(t(), float()) :: :ok - def put!(publisher, value) when is_float(value) do + def put(publisher, value) when is_float(value) do Nif.publisher_put_float(publisher, value) end @@ -57,12 +55,12 @@ defmodule Zenohex.Publisher do ## Examples - iex> session = Zenohex.open!() - iex> publisher = Zenohex.Session.declare_publisher!(session, "key/expression") - iex> :ok = Zenohex.Publisher.delete!(publisher) + iex> {:ok, session} = Zenohex.open() + iex> {:ok, publisher} = Zenohex.Session.declare_publisher(session, "key/expression") + iex> :ok = Zenohex.Publisher.delete(publisher) """ - @spec delete!(t()) :: :ok - def delete!(publisher) do + @spec delete(t()) :: :ok | {:error, reason :: String.t()} + def delete(publisher) do Nif.publisher_delete(publisher) end @@ -71,12 +69,12 @@ defmodule Zenohex.Publisher do ## Examples - iex> session = Zenohex.open!() - iex> publisher = Zenohex.Session.declare_publisher!(session, "key/expression") - iex> Zenohex.Publisher.congestion_control!(publisher, :drop) + iex> {:ok, session} = Zenohex.open() + iex> {:ok, publisher} = Zenohex.Session.declare_publisher(session, "key/expression") + iex> Zenohex.Publisher.congestion_control(publisher, :drop) """ - @spec congestion_control!(t(), Options.congestion_control()) :: t() - def congestion_control!(publisher, congestion_control) do + @spec congestion_control(t(), Options.congestion_control()) :: t() + def congestion_control(publisher, congestion_control) do Nif.publisher_congestion_control(publisher, congestion_control) end @@ -85,12 +83,12 @@ defmodule Zenohex.Publisher do ## Examples - iex> session = Zenohex.open!() - iex> publisher = Zenohex.Session.declare_publisher!(session, "key/expression") - iex> Zenohex.Publisher.priority!(publisher, :real_time) + iex> {:ok, session} = Zenohex.open() + iex> {:ok, publisher} = Zenohex.Session.declare_publisher(session, "key/expression") + iex> Zenohex.Publisher.priority(publisher, :real_time) """ - @spec priority!(t(), Options.priority()) :: t() - def priority!(publisher, priority) do + @spec priority(t(), Options.priority()) :: t() + def priority(publisher, priority) do Nif.publisher_priority(publisher, priority) end end diff --git a/lib/zenohex/pull_subscriber.ex b/lib/zenohex/pull_subscriber.ex index 3cb5130..b5f73df 100644 --- a/lib/zenohex/pull_subscriber.ex +++ b/lib/zenohex/pull_subscriber.ex @@ -12,13 +12,13 @@ defmodule Zenohex.PullSubscriber do ## Examples - iex> session = Zenohex.open!() - iex> subscriber = Zenohex.Session.declare_pull_subscriber!(session, "key/expression") - iex> Zenohex.PullSubscriber.pull!(subscriber) + iex> {:ok, session} = Zenohex.open() + iex> {:ok, pull_subscriber} = Zenohex.Session.declare_pull_subscriber(session, "key/expression") + iex> Zenohex.PullSubscriber.pull(pull_subscriber) :ok """ - @spec pull!(t()) :: :ok - def pull!(pull_subscriber) when is_reference(pull_subscriber) do + @spec pull(t()) :: :ok | {:error, reason :: String.t()} + def pull(pull_subscriber) when is_reference(pull_subscriber) do Nif.pull_subscriber_pull(pull_subscriber) end @@ -27,13 +27,16 @@ defmodule Zenohex.PullSubscriber do ## Examples - iex> session = Zenohex.open!() - iex> subscriber = Zenohex.Session.declare_pull_subscriber!(session, "key/expression") - iex> Zenohex.PullSubscriber.recv_timeout!(subscriber, 1000) - :timeout + iex> {:ok, session} = Zenohex.open() + iex> {:ok, pull_subscriber} = Zenohex.Session.declare_pull_subscriber(session, "key/expression") + iex> Zenohex.PullSubscriber.recv_timeout(pull_subscriber, 1000) + {:error, :timeout} """ - @spec recv_timeout!(t(), pos_integer()) :: integer() | float() | binary() | :timeout - def recv_timeout!(pull_subscriber, timeout_us) + @spec recv_timeout(t(), pos_integer()) :: + {:ok, integer() | float() | binary()} + | {:error, :timeout} + | {:error, reason :: String.t()} + def recv_timeout(pull_subscriber, timeout_us) when is_reference(pull_subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.pull_subscriber_recv_timeout(pull_subscriber, timeout_us) end diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex index cc825c8..fe9b5d0 100644 --- a/lib/zenohex/session.ex +++ b/lib/zenohex/session.ex @@ -6,6 +6,7 @@ defmodule Zenohex.Session do alias Zenohex.Nif alias Zenohex.Publisher alias Zenohex.Subscriber + alias Zenohex.PullSubscriber alias Zenohex.Queryable @type t :: reference() @@ -15,11 +16,12 @@ defmodule Zenohex.Session do ## Examples - iex> session = Zenohex.open!() - iex> Zenohex.Session.declare_publisher!(session, "key/expression") + iex> {:ok, session} = Zenohex.open() + iex> Zenohex.Session.declare_publisher(session, "key/expression") """ - @spec declare_publisher!(t(), String.t(), Publisher.Options.t()) :: Publisher.t() - def declare_publisher!(session, key_expr, opts \\ %Publisher.Options{}) + @spec declare_publisher(t(), String.t(), Publisher.Options.t()) :: + {:ok, Publisher.t()} | {:error, reason :: String.t()} + def declare_publisher(session, key_expr, opts \\ %Publisher.Options{}) when is_reference(session) and is_binary(key_expr) and is_struct(opts, Publisher.Options) do Nif.declare_publisher(session, key_expr, opts) end @@ -29,11 +31,12 @@ defmodule Zenohex.Session do ## Examples - iex> session = Zenohex.open!() - iex> Zenohex.Session.declare_subscriber!(session, "key/expression") + iex> {:ok, session} = Zenohex.open() + iex> Zenohex.Session.declare_subscriber(session, "key/expression") """ - @spec declare_subscriber!(t(), String.t(), Subscriber.Options.t()) :: Subscriber.t() - def declare_subscriber!(session, key_expr, opts \\ %Subscriber.Options{}) + @spec declare_subscriber(t(), String.t(), Subscriber.Options.t()) :: + {:ok, Subscriber.t()} | {:error, reason :: String.t()} + def declare_subscriber(session, key_expr, opts \\ %Subscriber.Options{}) when is_reference(session) and is_binary(key_expr) and is_struct(opts, Subscriber.Options) do Nif.declare_subscriber(session, key_expr, opts) end @@ -43,11 +46,12 @@ defmodule Zenohex.Session do ## Examples - iex> session = Zenohex.open!() - iex> Zenohex.Session.declare_pull_subscriber!(session, "key/expression") + iex> {:ok, session} = Zenohex.open() + iex> Zenohex.Session.declare_pull_subscriber(session, "key/expression") """ - @spec declare_pull_subscriber!(t(), String.t(), Subscriber.Options.t()) :: Subscriber.t() - def declare_pull_subscriber!(session, key_expr, opts \\ %Subscriber.Options{}) + @spec declare_pull_subscriber(t(), String.t(), Subscriber.Options.t()) :: + {:ok, PullSubscriber.t()} | {:error, reason :: String.t()} + def declare_pull_subscriber(session, key_expr, opts \\ %Subscriber.Options{}) when is_reference(session) and is_binary(key_expr) and is_struct(opts, Subscriber.Options) do Nif.declare_pull_subscriber(session, key_expr, opts) end @@ -57,11 +61,12 @@ defmodule Zenohex.Session do ## Examples - iex> session = Zenohex.open!() - iex> Zenohex.Session.declare_queryable!(session, "key/expression") + iex> {:ok, session} = Zenohex.open() + iex> Zenohex.Session.declare_queryable(session, "key/expression") """ - @spec declare_queryable!(t(), String.t(), Queryable.Options.t()) :: Queryable.t() - def declare_queryable!(session, key_expr, opts \\ %Queryable.Options{}) + @spec declare_queryable(t(), String.t(), Queryable.Options.t()) :: + {:ok, Queryable.t()} | {:error, reason :: String.t()} + def declare_queryable(session, key_expr, opts \\ %Queryable.Options{}) when is_reference(session) and is_binary(key_expr) and is_struct(opts, Queryable.Options) do Nif.declare_queryable(session, key_expr, opts) end @@ -71,25 +76,24 @@ defmodule Zenohex.Session do ## Examples - iex> session = Zenohex.open!() - iex> :ok = Zenohex.Session.put!(session, "key/expression", "value") - iex> :ok = Zenohex.Session.put!(session, "key/expression", 0) - iex> :ok = Zenohex.Session.put!(session, "key/expression", 0.0) + iex> {:ok, session} = Zenohex.open() + iex> :ok = Zenohex.Session.put(session, "key/expression", "value") + iex> :ok = Zenohex.Session.put(session, "key/expression", 0) + iex> :ok = Zenohex.Session.put(session, "key/expression", 0.0) """ - @spec put!(t(), String.t(), binary()) :: :ok - def put!(session, key_expr, value) + @spec put(t(), String.t(), binary() | integer() | float()) :: + :ok | {:error, reason :: String.t()} + def put(session, key_expr, value) when is_reference(session) and is_binary(key_expr) and is_binary(value) do Nif.session_put_binary(session, key_expr, value) end - @spec put!(t(), String.t(), integer()) :: :ok - def put!(session, key_expr, value) + def put(session, key_expr, value) when is_reference(session) and is_binary(key_expr) and is_integer(value) do Nif.session_put_integer(session, key_expr, value) end - @spec put!(t(), String.t(), float()) :: :ok - def put!(session, key_expr, value) + def put(session, key_expr, value) when is_reference(session) and is_binary(key_expr) and is_float(value) do Nif.session_put_float(session, key_expr, value) end @@ -99,14 +103,16 @@ defmodule Zenohex.Session do ## Examples - iex> session = Zenohex.open!() - iex> Zenohex.Session.get_timeout!(session, "key/**", 1000) - :timeout + iex> {:ok, session} = Zenohex.open() + iex> Zenohex.Session.get_timeout(session, "key/**", 1000) + {:error, :timeout} """ - @spec get_timeout!(t(), String.t(), pos_integer()) :: - binary() | integer() | float() | :timeout + @spec get_timeout(t(), String.t(), pos_integer()) :: + {:ok, binary() | integer() | float()} + | {:error, :timeout} + | {:error, reason :: String.t()} # FIXME 返り値がリストになるケースがあるはずなので、 Nif を含めて見直し修正すること - def get_timeout!(session, selector, timeout_us) + def get_timeout(session, selector, timeout_us) when is_reference(session) and is_binary(selector) and is_integer(timeout_us) and timeout_us > 0 do Nif.session_get_timeout(session, selector, timeout_us) @@ -117,12 +123,12 @@ defmodule Zenohex.Session do ## Examples - iex> session = Zenohex.open!() - iex> Zenohex.Session.delete!(session, "key/expression") + iex> {:ok, session} = Zenohex.open() + iex> Zenohex.Session.delete(session, "key/expression") :ok """ - @spec delete!(t(), String.t()) :: :ok - def delete!(session, key_expr) when is_reference(session) and is_binary(key_expr) do + @spec delete(t(), String.t()) :: :ok | {:error, reason :: String.t()} + def delete(session, key_expr) when is_reference(session) and is_binary(key_expr) do Nif.session_delete(session, key_expr) end end diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex index 3c9fe57..b5fd22c 100644 --- a/lib/zenohex/subscriber.ex +++ b/lib/zenohex/subscriber.ex @@ -22,13 +22,16 @@ defmodule Zenohex.Subscriber do ## Examples - iex> session = Zenohex.open!() - iex> subscriber = Zenohex.Session.declare_subscriber!(session, "key/expression") - iex> Zenohex.Subscriber.recv_timeout!(subscriber, 1000) - :timeout + iex> {:ok, session} = Zenohex.open() + iex> {:ok, subscriber} = Zenohex.Session.declare_subscriber(session, "key/expression") + iex> Zenohex.Subscriber.recv_timeout(subscriber, 1000) + {:error, :timeout} """ - @spec recv_timeout!(t(), pos_integer()) :: integer() | float() | binary() | :timeout - def recv_timeout!(subscriber, timeout_us) + @spec recv_timeout(t(), pos_integer()) :: + {:ok, integer() | float() | binary()} + | {:error, :timeout} + | {:error, reason :: String.t()} + def recv_timeout(subscriber, timeout_us) when is_reference(subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.subscriber_recv_timeout(subscriber, timeout_us) end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index b6b8078..dcff1a4 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -43,22 +43,26 @@ fn test_thread(env: Env) -> Atom { } #[rustler::nif] -fn zenoh_open() -> ResourceArc { +fn zenoh_open() -> Result, String> { let config = config::peer(); - let session: Session = zenoh::open(config).res_sync().expect("zenoh_open failed"); - ResourceArc::new(ExSessionRef(session.into_arc())) + match zenoh::open(config).res_sync() { + Ok(session) => Ok(ResourceArc::new(ExSessionRef(session.into_arc()))), + Err(error) => Err(error.to_string()), + } } #[rustler::nif] -fn zenoh_scouting_delay_zero_session() -> ResourceArc { +fn zenoh_scouting_delay_zero_session() -> Result, String> { let mut config = config::peer(); - config - .scouting - .set_delay(Some(0)) - .expect("set_delay failed"); - - let session: Session = zenoh::open(config).res_sync().expect("zenoh_open failed"); - ResourceArc::new(ExSessionRef(session.into_arc())) + let config = match config.scouting.set_delay(Some(0)) { + Ok(_) => config, + Err(_) => return Err("set_delay failed".to_string()), + }; + + match zenoh::open(config).res_sync() { + Ok(session) => Ok(ResourceArc::new(ExSessionRef(session.into_arc()))), + Err(error) => Err(error.to_string()), + } } #[rustler::nif] @@ -66,16 +70,17 @@ fn declare_publisher( resource: ResourceArc, key_expr: String, opts: publisher::PublisherOptions, -) -> ResourceArc { +) -> Result, String> { let session: &Arc = &resource.0; - let publisher: Publisher = session + match session .declare_publisher(key_expr) .congestion_control(opts.congestion_control.into()) .priority(opts.priority.into()) .res_sync() - .expect("declare_publisher failed"); - - ResourceArc::new(ExPublisherRef(publisher)) + { + Ok(publisher) => Ok(ResourceArc::new(ExPublisherRef(publisher))), + Err(error) => Err(error.to_string()), + } } #[rustler::nif] @@ -83,15 +88,16 @@ fn declare_subscriber( resource: ResourceArc, key_expr: String, opts: subscriber::SubscriberOptions, -) -> ResourceArc { +) -> Result, String> { let session: &Arc = &resource.0; - let subscriber: Subscriber<'_, Receiver> = session + match session .declare_subscriber(key_expr) .reliability(opts.reliability.into()) .res_sync() - .expect("declare_subscriber failed"); - - ResourceArc::new(ExSubscriberRef(subscriber)) + { + Ok(subscriber) => Ok(ResourceArc::new(ExSubscriberRef(subscriber))), + Err(error) => Err(error.to_string()), + } } #[rustler::nif] @@ -99,16 +105,17 @@ fn declare_pull_subscriber( resource: ResourceArc, key_expr: String, opts: subscriber::SubscriberOptions, -) -> ResourceArc { +) -> Result, String> { let session: &Arc = &resource.0; - let pull_subscriber: PullSubscriber<'_, Receiver> = session + match session .declare_subscriber(key_expr) .reliability(opts.reliability.into()) .pull_mode() .res_sync() - .expect("declare_pull_subscriber failed"); - - ResourceArc::new(ExPullSubscriberRef(pull_subscriber)) + { + Ok(pull_subscriber) => Ok(ResourceArc::new(ExPullSubscriberRef(pull_subscriber))), + Err(error) => Err(error.to_string()), + } } #[rustler::nif] @@ -116,43 +123,44 @@ fn declare_queryable( resource: ResourceArc, key_expr: String, opts: queryable::QueryableOptions, -) -> ResourceArc { +) -> Result, String> { let session: &Arc = &resource.0; - let queryable: Queryable<'_, Receiver> = session + match session .declare_queryable(key_expr) .complete(opts.complete) .res_sync() - .expect("declare_queryable failed"); - - ResourceArc::new(ExQueryableRef(queryable)) + { + Ok(queryable) => Ok(ResourceArc::new(ExQueryableRef(queryable))), + Err(error) => Err(error.to_string()), + } } -fn to_term<'a>(value: &Value, env: Env<'a>) -> Term<'a> { +fn to_result<'a>(value: &Value, env: Env<'a>) -> Result, Term<'a>> { match value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), KnownEncoding::AppOctetStream => match Cow::try_from(value) { Ok(value) => { let mut binary = OwnedBinary::new(value.len()).unwrap(); binary.as_mut_slice().write_all(&value).unwrap(); - binary.release(env).encode(env) + Ok(binary.release(env).encode(env)) } - Err(_err) => atom::error().encode(env), + Err(error) => Err(error.to_string().encode(env)), }, KnownEncoding::AppCustom => unimplemented!(), KnownEncoding::TextPlain => match String::try_from(value) { - Ok(value) => value.encode(env), - Err(_err) => atom::error().encode(env), + Ok(value) => Ok(value.encode(env)), + Err(error) => Err(error.to_string().encode(env)), }, KnownEncoding::AppProperties => unimplemented!(), KnownEncoding::AppJson => unimplemented!(), KnownEncoding::AppSql => unimplemented!(), KnownEncoding::AppInteger => match i64::try_from(value) { - Ok(value) => value.encode(env), - Err(_err) => atom::error().encode(env), + Ok(value) => Ok(value.encode(env)), + Err(error) => Err(error.to_string().encode(env)), }, KnownEncoding::AppFloat => match f64::try_from(value) { - Ok(value) => value.encode(env), - Err(_err) => atom::error().encode(env), + Ok(value) => Ok(value.encode(env)), + Err(error) => Err(error.to_string().encode(env)), }, KnownEncoding::AppXml => unimplemented!(), KnownEncoding::AppXhtmlXml => unimplemented!(), diff --git a/native/zenohex_nif/src/publisher.rs b/native/zenohex_nif/src/publisher.rs index 891c8bb..05ce1c0 100644 --- a/native/zenohex_nif/src/publisher.rs +++ b/native/zenohex_nif/src/publisher.rs @@ -1,42 +1,45 @@ use crate::ExPublisherRef; -use rustler::{types::atom, Atom, Binary, ResourceArc}; +use rustler::{types::atom, Binary, Encoder, Env, ResourceArc, Term}; use zenoh::{prelude::sync::SyncResolve, publication::Publisher, value::Value}; #[rustler::nif] -fn publisher_put_integer(resource: ResourceArc, value: i64) -> Atom { - publisher_put_impl(resource, value) +fn publisher_put_integer(env: Env, resource: ResourceArc, value: i64) -> Term { + publisher_put_impl(env, resource, value) } #[rustler::nif] -fn publisher_put_float(resource: ResourceArc, value: f64) -> Atom { - publisher_put_impl(resource, value) +fn publisher_put_float(env: Env, resource: ResourceArc, value: f64) -> Term { + publisher_put_impl(env, resource, value) } #[rustler::nif] -fn publisher_put_binary(resource: ResourceArc, value: Binary) -> Atom { - publisher_put_impl(resource, Value::from(value.as_slice())) +fn publisher_put_binary<'a>( + env: Env<'a>, + resource: ResourceArc, + value: Binary<'a>, +) -> Term<'a> { + publisher_put_impl(env, resource, Value::from(value.as_slice())) } fn publisher_put_impl>( + env: Env, resource: ResourceArc, value: T, -) -> Atom { +) -> Term { let publisher: &Publisher = &resource.0; - publisher - .put(value) - .res_sync() - .expect("publisher_put_impl failed"); - atom::ok() + match publisher.put(value).res_sync() { + Ok(_) => atom::ok().encode(env), + Err(error) => (atom::error(), error.to_string()).encode(env), + } } #[rustler::nif] -fn publisher_delete(resource: ResourceArc) -> Atom { +fn publisher_delete(env: Env, resource: ResourceArc) -> Term { let publisher: &Publisher = &resource.0; - publisher - .delete() - .res_sync() - .expect("publisher_delete failed."); - atom::ok() + match publisher.delete().res_sync() { + Ok(_) => atom::ok().encode(env), + Err(error) => (atom::error(), error.to_string()).encode(env), + } } #[rustler::nif] diff --git a/native/zenohex_nif/src/pull_subscriber.rs b/native/zenohex_nif/src/pull_subscriber.rs index e0f3ac9..9de7027 100644 --- a/native/zenohex_nif/src/pull_subscriber.rs +++ b/native/zenohex_nif/src/pull_subscriber.rs @@ -1,7 +1,7 @@ use std::time::Duration; use flume::Receiver; -use rustler::{types::atom, Atom, Encoder, Env, ResourceArc, Term}; +use rustler::{types::atom, Encoder, Env, ResourceArc, Term}; use zenoh::{prelude::sync::SyncResolve, sample::Sample, subscriber::PullSubscriber}; #[rustler::nif] @@ -9,20 +9,19 @@ fn pull_subscriber_recv_timeout( env: Env, resource: ResourceArc, timeout_us: u64, -) -> Term { +) -> Result { let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; match pull_subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => crate::to_term(&sample.value, env), - Err(_recv_timeout_error) => crate::atoms::timeout().encode(env), + Ok(sample) => crate::to_result(&sample.value, env), + Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } } #[rustler::nif] -fn pull_subscriber_pull(resource: ResourceArc) -> Atom { +fn pull_subscriber_pull(env: Env, resource: ResourceArc) -> Term { let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; - pull_subscriber - .pull() - .res_sync() - .expect("pull_subscriber_pull failed"); - atom::ok() + match pull_subscriber.pull().res_sync() { + Ok(_) => atom::ok().encode(env), + Err(error) => (atom::error(), error.to_string()).encode(env), + } } diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index ba0a011..1c1f31f 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -1,48 +1,49 @@ use std::{sync::Arc, time::Duration}; -use rustler::{types::atom, Atom, Binary, Encoder, Env, ResourceArc, Term}; +use rustler::{types::atom, Binary, Encoder, Env, ResourceArc, Term}; use zenoh::{prelude::sync::SyncResolve, value::Value, Session}; #[rustler::nif] fn session_put_integer( + env: Env, resource: ResourceArc, key_expr: String, value: i64, -) -> Atom { - let session: &Arc = &resource.0; - session - .put(key_expr, value) - .res_sync() - .expect("session_put_integer failed"); - atom::ok() +) -> Term { + session_put_impl(env, resource, key_expr, value) } #[rustler::nif] fn session_put_float( + env: Env, resource: ResourceArc, key_expr: String, value: f64, -) -> Atom { - let session: &Arc = &resource.0; - session - .put(key_expr, value) - .res_sync() - .expect("session_put_float failed"); - atom::ok() +) -> Term { + session_put_impl(env, resource, key_expr, value) } #[rustler::nif] -fn session_put_binary( +fn session_put_binary<'a>( + env: Env<'a>, resource: ResourceArc, key_expr: String, - value: Binary, -) -> Atom { + value: Binary<'a>, +) -> Term<'a> { + session_put_impl(env, resource, key_expr, Value::from(value.as_slice())) +} + +fn session_put_impl>( + env: Env, + resource: ResourceArc, + key_expr: String, + value: T, +) -> Term { let session: &Arc = &resource.0; - session - .put(key_expr, Value::from(value.as_slice())) - .res_sync() - .expect("session_put_float failed"); - atom::ok() + match session.put(key_expr, value).res_sync() { + Ok(_) => atom::ok().encode(env), + Err(error) => (atom::error(), error.to_string()).encode(env), + } } #[rustler::nif] @@ -51,27 +52,26 @@ fn session_get_timeout( resource: ResourceArc, selector: String, timeout_us: u64, -) -> Term { +) -> Result { let session: &Arc = &resource.0; - let receiver = session - .get(selector) - .res_sync() - .expect("session_get failed"); + let receiver = match session.get(selector).res_sync() { + Ok(receiver) => receiver, + Err(error) => return Err(error.to_string().encode(env)), + }; match receiver.recv_timeout(Duration::from_micros(timeout_us)) { Ok(reply) => match reply.sample { - Ok(sample) => crate::to_term(&sample.value, env).encode(env), - Err(value) => crate::to_term(&value, env).encode(env), + Ok(sample) => crate::to_result(&sample.value, env), + Err(value) => crate::to_result(&value, env), }, - Err(_recv_timeout_error) => crate::atoms::timeout().encode(env), + Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } } #[rustler::nif] -fn session_delete(resource: ResourceArc, key_expr: String) -> Atom { +fn session_delete(env: Env, resource: ResourceArc, key_expr: String) -> Term { let session: &Arc = &resource.0; - session - .delete(key_expr) - .res_sync() - .expect("session_delete failed"); - atom::ok() + match session.delete(key_expr).res_sync() { + Ok(_) => atom::ok().encode(env), + Err(error) => (atom::error(), error.to_string()).encode(env), + } } diff --git a/native/zenohex_nif/src/subscriber.rs b/native/zenohex_nif/src/subscriber.rs index c6e9aa5..489c383 100644 --- a/native/zenohex_nif/src/subscriber.rs +++ b/native/zenohex_nif/src/subscriber.rs @@ -9,11 +9,11 @@ fn subscriber_recv_timeout( env: Env, resource: ResourceArc, timeout_us: u64, -) -> Term { +) -> Result { let subscriber: &Subscriber<'_, Receiver> = &resource.0; match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => crate::to_term(&sample.value, env), - Err(_recv_timeout_error) => crate::atoms::timeout().encode(env), + Ok(sample) => crate::to_result(&sample.value, env), + Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } } diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 908b3da..dda2bfc 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -14,7 +14,8 @@ defmodule Zenohex.NifTest do end setup_all do - %{session: Nif.zenoh_open()} + {:ok, session} = Nif.zenoh_open() + %{session: session} end describe "session" do @@ -31,7 +32,7 @@ defmodule Zenohex.NifTest do end test "session_get_timeout/3", %{session: session} do - assert Nif.session_get_timeout(session, "key_expression", 1000) == :timeout + assert Nif.session_get_timeout(session, "key_expression", 1000) == {:error, :timeout} end test "session_delete/2", %{session: session} do @@ -43,21 +44,23 @@ defmodule Zenohex.NifTest do alias Zenohex.Publisher.Options test "declare_publisher/2", %{session: session} do - assert is_reference(Nif.declare_publisher(session, "key/expression")) + {:ok, publisher} = Nif.declare_publisher(session, "key/expression") + assert is_reference(publisher) end test "declare_publisher/3", %{session: session} do opts = %Options{congestion_control: :block, priority: :real_time} - assert is_reference(Nif.declare_publisher(session, "key/expression", opts)) + {:ok, publisher} = Nif.declare_publisher(session, "key/expression", opts) + assert is_reference(publisher) end test "publisher_congestion_control/2", %{session: session} do - publisher = Nif.declare_publisher(session, "key/expression") + {:ok, publisher} = Nif.declare_publisher(session, "key/expression") assert is_reference(Nif.publisher_congestion_control(publisher, :block)) end test "publisher_priority/2", %{session: session} do - publisher = Nif.declare_publisher(session, "key/expression") + {:ok, publisher} = Nif.declare_publisher(session, "key/expression") assert is_reference(Nif.publisher_priority(publisher, :real_time)) end @@ -69,13 +72,13 @@ defmodule Zenohex.NifTest do test "publisher_put_#{type}/2", %{session: session} do type = unquote(type) value = unquote(value) - publisher = Nif.declare_publisher(session, "key/expression") + {:ok, publisher} = Nif.declare_publisher(session, "key/expression") assert apply(Nif, :"publisher_put_#{type}", [publisher, value]) == :ok end end test "publisher_delete/1", %{session: session} do - publisher = Nif.declare_publisher(session, "key/expression") + {:ok, publisher} = Nif.declare_publisher(session, "key/expression") assert Nif.publisher_delete(publisher) == :ok end end @@ -84,27 +87,29 @@ defmodule Zenohex.NifTest do alias Zenohex.Subscriber.Options test "declare_subscriber/2", %{session: session} do - assert is_reference(Nif.declare_subscriber(session, "key/expression")) + {:ok, subscriber} = Nif.declare_subscriber(session, "key/expression") + assert is_reference(subscriber) end test "declare_subscriber/3", %{session: session} do opts = %Options{reliability: :reliable} - assert is_reference(Nif.declare_subscriber(session, "key/expression", opts)) + {:ok, subscriber} = Nif.declare_subscriber(session, "key/expression", opts) + assert is_reference(subscriber) end test "subscriber_recv_timeout/1", %{session: session} do - publisher = Nif.declare_publisher(session, "key/expression") - subscriber = Nif.declare_subscriber(session, "key/expression") + {:ok, publisher} = Nif.declare_publisher(session, "key/expression") + {:ok, subscriber} = Nif.declare_subscriber(session, "key/expression") Nif.publisher_put_integer(publisher, 0) - assert Nif.subscriber_recv_timeout(subscriber, 1000) == 0 + assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:ok, 0} Nif.publisher_put_float(publisher, 0.0) - assert Nif.subscriber_recv_timeout(subscriber, 1000) == 0.0 + assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:ok, 0.0} Nif.publisher_put_binary(publisher, "binary") - assert Nif.subscriber_recv_timeout(subscriber, 1000) == "binary" - assert Nif.subscriber_recv_timeout(subscriber, 1000) == :timeout + assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:ok, "binary"} + assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:error, :timeout} end end @@ -112,31 +117,33 @@ defmodule Zenohex.NifTest do alias Zenohex.Subscriber.Options test "declare_pull_subscriber/2", %{session: session} do - assert is_reference(Nif.declare_pull_subscriber(session, "key/expression")) + {:ok, pull_subscriber} = Nif.declare_pull_subscriber(session, "key/expression") + assert is_reference(pull_subscriber) end test "declare_pull_subscriber/3", %{session: session} do opts = %Options{reliability: :reliable} - assert is_reference(Nif.declare_pull_subscriber(session, "key/expression", opts)) + {:ok, pull_subscriber} = Nif.declare_pull_subscriber(session, "key/expression", opts) + assert is_reference(pull_subscriber) end test "pull_subscriber_pull/1", %{session: session} do - publisher = Nif.declare_publisher(session, "key/expression") - pull_subscriber = Nif.declare_pull_subscriber(session, "key/expression") + {:ok, publisher} = Nif.declare_publisher(session, "key/expression") + {:ok, pull_subscriber} = Nif.declare_pull_subscriber(session, "key/expression") :ok = Nif.publisher_put_integer(publisher, 0) - 0 = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) - :timeout = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) + {:ok, 0} = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) + {:error, :timeout} = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) assert Nif.pull_subscriber_pull(pull_subscriber) == :ok - assert Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) == 0 + assert Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) == {:ok, 0} end end describe "binary pub/sub" do setup context do key_expr = "key/expression" - publisher = Nif.declare_publisher(context.session, key_expr) - subscriber = Nif.declare_subscriber(context.session, key_expr) + {:ok, publisher} = Nif.declare_publisher(context.session, key_expr) + {:ok, subscriber} = Nif.declare_subscriber(context.session, key_expr) %{publisher: publisher, subscriber: subscriber} end @@ -147,7 +154,7 @@ defmodule Zenohex.NifTest do test "#{test_name}", %{publisher: publisher, subscriber: subscriber} do binary = unquote(binary) Nif.publisher_put_binary(publisher, binary) - assert Nif.subscriber_recv_timeout(subscriber, 1000) == binary + assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:ok, binary} end end end @@ -156,12 +163,14 @@ defmodule Zenohex.NifTest do alias Zenohex.Queryable.Options test "declare_queryable/2", %{session: session} do - assert is_reference(Nif.declare_queryable(session, "key/expression")) + {:ok, queryable} = Nif.declare_queryable(session, "key/expression") + assert is_reference(queryable) end test "declare_queryable/3", %{session: session} do opts = %Options{complete: true} - assert is_reference(Nif.declare_queryable(session, "key/expression", opts)) + {:ok, queryable} = Nif.declare_queryable(session, "key/expression", opts) + assert is_reference(queryable) end end end diff --git a/test/zenohex_test.exs b/test/zenohex_test.exs index cb93faa..7650904 100644 --- a/test/zenohex_test.exs +++ b/test/zenohex_test.exs @@ -3,15 +3,15 @@ defmodule ZenohexTest do doctest Zenohex test "pub/sub" do - session = Zenohex.open!() - publisher = Zenohex.Session.declare_publisher!(session, "pub/sub") - subscriber = Zenohex.Session.declare_subscriber!(session, "pub/sub") + {:ok, session} = Zenohex.open() + {:ok, publisher} = Zenohex.Session.declare_publisher(session, "pub/sub") + {:ok, subscriber} = Zenohex.Session.declare_subscriber(session, "pub/sub") for i <- 1..100 do - :ok = Zenohex.Publisher.put!(publisher, "Hello Zenoh Dragon #{i}") + :ok = Zenohex.Publisher.put(publisher, "Hello Zenoh Dragon #{i}") - assert Zenohex.Subscriber.recv_timeout!(subscriber, 1000) == - "Hello Zenoh Dragon #{i}" + assert Zenohex.Subscriber.recv_timeout(subscriber, 1000) == + {:ok, "Hello Zenoh Dragon #{i}"} end end end From d401df3c9fee5dc984052c3e4e7df92c5ca77641 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 1 Feb 2024 14:49:53 +0900 Subject: [PATCH 054/165] Fix session get, to be able to receive multiple reply --- lib/zenohex/nif.ex | 7 +++++- lib/zenohex/query.ex | 18 +++++++++++++ lib/zenohex/session.ex | 36 ++++++++++++++++++-------- native/zenohex_nif/src/lib.rs | 8 ++++-- native/zenohex_nif/src/query.rs | 42 +++++++++++++++++++++++++++++++ native/zenohex_nif/src/session.rs | 36 +++++++++++++++++++------- test/zenohex/nif_test.exs | 10 ++++++-- 7 files changed, 132 insertions(+), 25 deletions(-) create mode 100644 lib/zenohex/query.ex create mode 100644 native/zenohex_nif/src/query.rs diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index dd4139b..b866f00 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -20,6 +20,7 @@ defmodule Zenohex.Nif do alias Zenohex.Publisher alias Zenohex.Subscriber alias Zenohex.Queryable + alias Zenohex.Query # When your NIF is loaded, it will override this function. def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) @@ -42,7 +43,11 @@ defmodule Zenohex.Nif do end end - def session_get_timeout(_session, _selector, _timeout_us) do + def session_get_reply_receiver(_session, _selector, _opts \\ %Query.Options{}) do + :erlang.nif_error(:nif_not_loaded) + end + + def session_get_reply_timeout(_receiver, _timeout_us) do :erlang.nif_error(:nif_not_loaded) end diff --git a/lib/zenohex/query.ex b/lib/zenohex/query.ex new file mode 100644 index 0000000..1550654 --- /dev/null +++ b/lib/zenohex/query.ex @@ -0,0 +1,18 @@ +defmodule Zenohex.Query do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + @type t :: reference() + + defmodule Options do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + @type t :: %__MODULE__{target: target(), consolidation: consolidation()} + @type target :: :best_matching | :all | :all_complete + @type consolidation :: :auto | :none | :monotonic | :latest + defstruct target: :best_matching, consolidation: :auto + end +end diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex index fe9b5d0..ba63810 100644 --- a/lib/zenohex/session.ex +++ b/lib/zenohex/session.ex @@ -8,8 +8,10 @@ defmodule Zenohex.Session do alias Zenohex.Subscriber alias Zenohex.PullSubscriber alias Zenohex.Queryable + alias Zenohex.Query @type t :: reference() + @type receiver :: reference() @doc ~S""" Create a Publisher for the given key expression. @@ -99,23 +101,35 @@ defmodule Zenohex.Session do end @doc ~S""" - Query data from the matching queryables in the system. + Get reply receiver from the matching queryables in the system. ## Examples iex> {:ok, session} = Zenohex.open() - iex> Zenohex.Session.get_timeout(session, "key/**", 1000) + iex> Zenohex.Session.get_reply_receiver(session, "key/**") + """ + @spec get_reply_receiver(t(), String.t(), Query.Options.t()) :: + {:ok, receiver()} | {:error, reason :: String.t()} + def get_reply_receiver(session, selector, opts \\ %Query.Options{}) + when is_reference(session) and is_binary(selector) and is_struct(opts, Query.Options) do + Nif.session_get_reply_receiver(session, selector, opts) + end + + @doc ~S""" + Query data from receiver. + + ## Examples + + iex> {:ok, session} = Zenohex.open() + iex> {:ok, receiver} = Zenohex.Session.get_reply_receiver(session, "key/**") + iex> Zenohex.Session.get_reply_timeout(receiver, 1000) {:error, :timeout} """ - @spec get_timeout(t(), String.t(), pos_integer()) :: - {:ok, binary() | integer() | float()} - | {:error, :timeout} - | {:error, reason :: String.t()} - # FIXME 返り値がリストになるケースがあるはずなので、 Nif を含めて見直し修正すること - def get_timeout(session, selector, timeout_us) - when is_reference(session) and is_binary(selector) and is_integer(timeout_us) and - timeout_us > 0 do - Nif.session_get_timeout(session, selector, timeout_us) + @spec get_reply_timeout(receiver(), pos_integer()) :: + {:ok, binary() | integer() | float()} | {:error, :timeout} | {:error, reason :: any()} + def get_reply_timeout(receiver, timeout_us) + when is_reference(receiver) and is_integer(timeout_us) and timeout_us > 0 do + Nif.session_get_reply_timeout(receiver, timeout_us) end @doc ~S""" diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index dcff1a4..5a89356 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -11,7 +11,7 @@ use zenoh::{ publication::Publisher, queryable::Queryable, subscriber::PullSubscriber, subscriber::Subscriber, Session, }; -use zenoh::{queryable::Query, sample::Sample}; +use zenoh::{query::Reply, queryable::Query, sample::Sample}; mod atoms { rustler::atoms! { @@ -20,6 +20,7 @@ mod atoms { } mod publisher; mod pull_subscriber; +mod query; mod queryable; mod session; mod subscriber; @@ -29,6 +30,7 @@ pub struct ExPublisherRef(Publisher<'static>); pub struct ExSubscriberRef(Subscriber<'static, Receiver>); pub struct ExPullSubscriberRef(PullSubscriber<'static, Receiver>); pub struct ExQueryableRef(Queryable<'static, Receiver>); +pub struct ExReplyReceiverRef(Receiver); #[rustler::nif] fn add(a: i64, b: i64) -> i64 { @@ -183,6 +185,7 @@ fn load(env: Env, _term: Term) -> bool { rustler::resource!(ExSubscriberRef, env); rustler::resource!(ExPullSubscriberRef, env); rustler::resource!(ExQueryableRef, env); + rustler::resource!(ExReplyReceiverRef, env); true } @@ -200,7 +203,8 @@ rustler::init!( session::session_put_integer, session::session_put_float, session::session_put_binary, - session::session_get_timeout, + session::session_get_reply_receiver, + session::session_get_reply_timeout, session::session_delete, publisher::publisher_put_integer, publisher::publisher_put_float, diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs new file mode 100644 index 0000000..4bf4c2a --- /dev/null +++ b/native/zenohex_nif/src/query.rs @@ -0,0 +1,42 @@ +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Query.Options"] +pub struct QueryOptions { + pub(crate) target: QueryTarget, + pub(crate) consolidation: ConsolidationMode, +} + +#[derive(rustler::NifUnitEnum)] +pub enum QueryTarget { + BestMatching, + All, + AllComplete, +} + +impl From for zenoh::query::QueryTarget { + fn from(value: QueryTarget) -> Self { + match value { + QueryTarget::BestMatching => zenoh::query::QueryTarget::BestMatching, + QueryTarget::All => zenoh::query::QueryTarget::All, + QueryTarget::AllComplete => zenoh::query::QueryTarget::AllComplete, + } + } +} + +#[derive(rustler::NifUnitEnum)] +pub enum ConsolidationMode { + Auto, + None, + Monotonic, + Latest, +} + +impl From for zenoh::query::QueryConsolidation { + fn from(value: ConsolidationMode) -> Self { + match value { + ConsolidationMode::Auto => zenoh::query::Mode::Auto.into(), + ConsolidationMode::None => zenoh::query::ConsolidationMode::None.into(), + ConsolidationMode::Monotonic => zenoh::query::ConsolidationMode::Monotonic.into(), + ConsolidationMode::Latest => zenoh::query::ConsolidationMode::Latest.into(), + } + } +} diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index 1c1f31f..71edff9 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -1,7 +1,8 @@ use std::{sync::Arc, time::Duration}; +use flume::Receiver; use rustler::{types::atom, Binary, Encoder, Env, ResourceArc, Term}; -use zenoh::{prelude::sync::SyncResolve, value::Value, Session}; +use zenoh::{prelude::sync::SyncResolve, query::Reply, value::Value, Session}; #[rustler::nif] fn session_put_integer( @@ -47,21 +48,38 @@ fn session_put_impl>( } #[rustler::nif] -fn session_get_timeout( - env: Env, +fn session_get_reply_receiver( resource: ResourceArc, selector: String, + opts: crate::query::QueryOptions, +) -> Result, String> { + let session: &Arc = &resource.0; + // TODO: with_value の実装は用途が出てきたら検討 + match session + .get(selector) + .target(opts.target.into()) + .consolidation(opts.consolidation) + .res_sync() + { + Ok(receiver) => Ok(ResourceArc::new(crate::ExReplyReceiverRef(receiver))), + Err(error) => Err(error.to_string()), + } +} + +#[rustler::nif] +fn session_get_reply_timeout( + env: Env, + resource: ResourceArc, timeout_us: u64, ) -> Result { - let session: &Arc = &resource.0; - let receiver = match session.get(selector).res_sync() { - Ok(receiver) => receiver, - Err(error) => return Err(error.to_string().encode(env)), - }; + let receiver: &Receiver = &resource.0; match receiver.recv_timeout(Duration::from_micros(timeout_us)) { Ok(reply) => match reply.sample { Ok(sample) => crate::to_result(&sample.value, env), - Err(value) => crate::to_result(&value, env), + Err(value) => match crate::to_result(&value, env) { + Ok(term) => Err(term), + Err(term) => Err(term), + }, }, Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index dda2bfc..c4af207 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -31,8 +31,14 @@ defmodule Zenohex.NifTest do end end - test "session_get_timeout/3", %{session: session} do - assert Nif.session_get_timeout(session, "key_expression", 1000) == {:error, :timeout} + test "session_get_reply_receiver/3", %{session: session} do + {:ok, receiver} = Nif.session_get_reply_receiver(session, "key_expression") + assert is_reference(receiver) + end + + test "session_get_reply_timeout/2", %{session: session} do + {:ok, receiver} = Nif.session_get_reply_receiver(session, "key_expression") + assert Nif.session_get_reply_timeout(receiver, 1000) == {:error, :timeout} end test "session_delete/2", %{session: session} do From 617c19a599564b28f50bf8f3d6b32aeceac88ff5 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 1 Feb 2024 14:50:07 +0900 Subject: [PATCH 055/165] Update mix aliases --- mix.exs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 465a8c7..142bc1c 100644 --- a/mix.exs +++ b/mix.exs @@ -17,7 +17,10 @@ defmodule Zenohex.MixProject do name: "ZenohEx", source_url: @source_url, docs: docs(), - aliases: [test: [&disable_zenoh_delay/1, "test"]] + aliases: [ + {:test, [&disable_zenoh_delay/1, "test"]}, + {:"test.watch", [&disable_zenoh_delay/1, "test.watch"]} + ] ] end From 49a4dce7939f0507decfaafe97861e5e4a5cb04d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 2 Feb 2024 10:48:29 +0900 Subject: [PATCH 056/165] Add Sample struct We need to know sample kind, put/delete, to control storage like KV store. --- lib/zenohex/pull_subscriber.ex | 5 +-- lib/zenohex/sample.ex | 12 ++++++ lib/zenohex/session.ex | 3 +- lib/zenohex/subscriber.ex | 5 +-- native/zenohex_nif/src/lib.rs | 48 ++-------------------- native/zenohex_nif/src/pull_subscriber.rs | 2 +- native/zenohex_nif/src/sample.rs | 34 +++++++++++++++ native/zenohex_nif/src/session.rs | 7 +--- native/zenohex_nif/src/subscriber.rs | 2 +- native/zenohex_nif/src/value.rs | 50 +++++++++++++++++++++++ test/zenohex/nif_test.exs | 13 +++--- test/zenohex_test.exs | 4 +- 12 files changed, 119 insertions(+), 66 deletions(-) create mode 100644 lib/zenohex/sample.ex create mode 100644 native/zenohex_nif/src/sample.rs create mode 100644 native/zenohex_nif/src/value.rs diff --git a/lib/zenohex/pull_subscriber.ex b/lib/zenohex/pull_subscriber.ex index b5f73df..9c2c176 100644 --- a/lib/zenohex/pull_subscriber.ex +++ b/lib/zenohex/pull_subscriber.ex @@ -4,6 +4,7 @@ defmodule Zenohex.PullSubscriber do """ alias Zenohex.Nif + alias Zenohex.Sample @type t :: reference() @@ -33,9 +34,7 @@ defmodule Zenohex.PullSubscriber do {:error, :timeout} """ @spec recv_timeout(t(), pos_integer()) :: - {:ok, integer() | float() | binary()} - | {:error, :timeout} - | {:error, reason :: String.t()} + {:ok, Sample.t()} | {:error, :timeout} | {:error, reason :: String.t()} def recv_timeout(pull_subscriber, timeout_us) when is_reference(pull_subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.pull_subscriber_recv_timeout(pull_subscriber, timeout_us) diff --git a/lib/zenohex/sample.ex b/lib/zenohex/sample.ex new file mode 100644 index 0000000..e7fda70 --- /dev/null +++ b/lib/zenohex/sample.ex @@ -0,0 +1,12 @@ +defmodule Zenohex.Sample do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + @type t :: %__MODULE__{ + key_expr: String.t(), + value: binary() | integer() | float(), + kind: :put | :delete + } + defstruct [:key_expr, :value, :kind] +end diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex index ba63810..d541f18 100644 --- a/lib/zenohex/session.ex +++ b/lib/zenohex/session.ex @@ -9,6 +9,7 @@ defmodule Zenohex.Session do alias Zenohex.PullSubscriber alias Zenohex.Queryable alias Zenohex.Query + alias Zenohex.Sample @type t :: reference() @type receiver :: reference() @@ -126,7 +127,7 @@ defmodule Zenohex.Session do {:error, :timeout} """ @spec get_reply_timeout(receiver(), pos_integer()) :: - {:ok, binary() | integer() | float()} | {:error, :timeout} | {:error, reason :: any()} + {:ok, Sample.t()} | {:error, :timeout} | {:error, reason :: any()} def get_reply_timeout(receiver, timeout_us) when is_reference(receiver) and is_integer(timeout_us) and timeout_us > 0 do Nif.session_get_reply_timeout(receiver, timeout_us) diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex index b5fd22c..707db26 100644 --- a/lib/zenohex/subscriber.ex +++ b/lib/zenohex/subscriber.ex @@ -4,6 +4,7 @@ defmodule Zenohex.Subscriber do """ alias Zenohex.Nif + alias Zenohex.Sample @opaque t :: reference() @@ -28,9 +29,7 @@ defmodule Zenohex.Subscriber do {:error, :timeout} """ @spec recv_timeout(t(), pos_integer()) :: - {:ok, integer() | float() | binary()} - | {:error, :timeout} - | {:error, reason :: String.t()} + {:ok, Sample.t()} | {:error, :timeout} | {:error, reason :: String.t()} def recv_timeout(subscriber, timeout_us) when is_reference(subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.subscriber_recv_timeout(subscriber, timeout_us) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 5a89356..03b8e5a 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -1,10 +1,8 @@ -use std::borrow::Cow; -use std::io::Write; use std::sync::Arc; use flume::Receiver; use rustler::types::atom; -use rustler::{thread, Encoder, OwnedBinary}; +use rustler::{thread, Encoder}; use rustler::{Atom, Env, ResourceArc, Term}; use zenoh::prelude::sync::*; use zenoh::{ @@ -22,8 +20,10 @@ mod publisher; mod pull_subscriber; mod query; mod queryable; +mod sample; mod session; mod subscriber; +mod value; pub struct ExSessionRef(Arc); pub struct ExPublisherRef(Publisher<'static>); @@ -137,48 +137,6 @@ fn declare_queryable( } } -fn to_result<'a>(value: &Value, env: Env<'a>) -> Result, Term<'a>> { - match value.encoding.prefix() { - KnownEncoding::Empty => unimplemented!(), - KnownEncoding::AppOctetStream => match Cow::try_from(value) { - Ok(value) => { - let mut binary = OwnedBinary::new(value.len()).unwrap(); - binary.as_mut_slice().write_all(&value).unwrap(); - Ok(binary.release(env).encode(env)) - } - Err(error) => Err(error.to_string().encode(env)), - }, - KnownEncoding::AppCustom => unimplemented!(), - KnownEncoding::TextPlain => match String::try_from(value) { - Ok(value) => Ok(value.encode(env)), - Err(error) => Err(error.to_string().encode(env)), - }, - KnownEncoding::AppProperties => unimplemented!(), - KnownEncoding::AppJson => unimplemented!(), - KnownEncoding::AppSql => unimplemented!(), - KnownEncoding::AppInteger => match i64::try_from(value) { - Ok(value) => Ok(value.encode(env)), - Err(error) => Err(error.to_string().encode(env)), - }, - KnownEncoding::AppFloat => match f64::try_from(value) { - Ok(value) => Ok(value.encode(env)), - Err(error) => Err(error.to_string().encode(env)), - }, - KnownEncoding::AppXml => unimplemented!(), - KnownEncoding::AppXhtmlXml => unimplemented!(), - KnownEncoding::AppXWwwFormUrlencoded => unimplemented!(), - KnownEncoding::TextJson => unimplemented!(), - KnownEncoding::TextHtml => unimplemented!(), - KnownEncoding::TextXml => unimplemented!(), - KnownEncoding::TextCss => unimplemented!(), - KnownEncoding::TextCsv => unimplemented!(), - KnownEncoding::TextJavascript => unimplemented!(), - KnownEncoding::ImageJpeg => unimplemented!(), - KnownEncoding::ImagePng => unimplemented!(), - KnownEncoding::ImageGif => unimplemented!(), - } -} - fn load(env: Env, _term: Term) -> bool { rustler::resource!(ExSessionRef, env); rustler::resource!(ExPublisherRef, env); diff --git a/native/zenohex_nif/src/pull_subscriber.rs b/native/zenohex_nif/src/pull_subscriber.rs index 9de7027..f2f05b1 100644 --- a/native/zenohex_nif/src/pull_subscriber.rs +++ b/native/zenohex_nif/src/pull_subscriber.rs @@ -12,7 +12,7 @@ fn pull_subscriber_recv_timeout( ) -> Result { let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; match pull_subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => crate::to_result(&sample.value, env), + Ok(sample) => Ok(crate::sample::Sample::from(env, sample).encode(env)), Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } } diff --git a/native/zenohex_nif/src/sample.rs b/native/zenohex_nif/src/sample.rs new file mode 100644 index 0000000..8bd902b --- /dev/null +++ b/native/zenohex_nif/src/sample.rs @@ -0,0 +1,34 @@ +use rustler::{Env, Term}; + +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Sample"] +pub struct Sample<'a> { + pub(crate) key_expr: String, + pub(crate) value: Term<'a>, + pub(crate) kind: SampleKind, +} + +impl Sample<'_> { + pub(crate) fn from(env: Env, sample: zenoh::sample::Sample) -> Sample { + Sample { + key_expr: sample.key_expr.to_string(), + value: crate::value::Value::to_term(env, &sample.value), + kind: sample.kind.into(), + } + } +} + +#[derive(rustler::NifUnitEnum)] +pub enum SampleKind { + Put, + Delete, +} + +impl From for SampleKind { + fn from(kind: zenoh::prelude::SampleKind) -> Self { + match kind { + zenoh::prelude::SampleKind::Put => SampleKind::Put, + zenoh::prelude::SampleKind::Delete => SampleKind::Delete, + } + } +} diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index 71edff9..89e585a 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -75,11 +75,8 @@ fn session_get_reply_timeout( let receiver: &Receiver = &resource.0; match receiver.recv_timeout(Duration::from_micros(timeout_us)) { Ok(reply) => match reply.sample { - Ok(sample) => crate::to_result(&sample.value, env), - Err(value) => match crate::to_result(&value, env) { - Ok(term) => Err(term), - Err(term) => Err(term), - }, + Ok(sample) => Ok(crate::sample::Sample::from(env, sample).encode(env)), + Err(value) => Err(crate::value::Value::to_term(env, &value)), }, Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } diff --git a/native/zenohex_nif/src/subscriber.rs b/native/zenohex_nif/src/subscriber.rs index 489c383..bef35a2 100644 --- a/native/zenohex_nif/src/subscriber.rs +++ b/native/zenohex_nif/src/subscriber.rs @@ -12,7 +12,7 @@ fn subscriber_recv_timeout( ) -> Result { let subscriber: &Subscriber<'_, Receiver> = &resource.0; match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => crate::to_result(&sample.value, env), + Ok(sample) => Ok(crate::sample::Sample::from(env, sample).encode(env)), Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } } diff --git a/native/zenohex_nif/src/value.rs b/native/zenohex_nif/src/value.rs new file mode 100644 index 0000000..3012fc1 --- /dev/null +++ b/native/zenohex_nif/src/value.rs @@ -0,0 +1,50 @@ +use std::{borrow::Cow, io::Write}; + +use rustler::{Encoder, Env, OwnedBinary, Term}; +use zenoh::prelude::KnownEncoding; + +pub(crate) struct Value; + +impl Value { + pub(crate) fn to_term<'a>(env: Env<'a>, value: &zenoh::value::Value) -> Term<'a> { + match value.encoding.prefix() { + KnownEncoding::Empty => unimplemented!(), + KnownEncoding::AppOctetStream => match Cow::try_from(value) { + Ok(value) => { + let mut binary = OwnedBinary::new(value.len()).unwrap(); + binary.as_mut_slice().write_all(&value).unwrap(); + binary.release(env).encode(env) + } + Err(error) => panic!("{}", error.to_string()), + }, + KnownEncoding::AppCustom => unimplemented!(), + KnownEncoding::TextPlain => match String::try_from(value) { + Ok(value) => value.encode(env), + Err(error) => panic!("{}", error.to_string()), + }, + KnownEncoding::AppProperties => unimplemented!(), + KnownEncoding::AppJson => unimplemented!(), + KnownEncoding::AppSql => unimplemented!(), + KnownEncoding::AppInteger => match i64::try_from(value) { + Ok(value) => value.encode(env), + Err(error) => panic!("{}", error.to_string()), + }, + KnownEncoding::AppFloat => match f64::try_from(value) { + Ok(value) => value.encode(env), + Err(error) => panic!("{}", error.to_string()), + }, + KnownEncoding::AppXml => unimplemented!(), + KnownEncoding::AppXhtmlXml => unimplemented!(), + KnownEncoding::AppXWwwFormUrlencoded => unimplemented!(), + KnownEncoding::TextJson => unimplemented!(), + KnownEncoding::TextHtml => unimplemented!(), + KnownEncoding::TextXml => unimplemented!(), + KnownEncoding::TextCss => unimplemented!(), + KnownEncoding::TextCsv => unimplemented!(), + KnownEncoding::TextJavascript => unimplemented!(), + KnownEncoding::ImageJpeg => unimplemented!(), + KnownEncoding::ImagePng => unimplemented!(), + KnownEncoding::ImageGif => unimplemented!(), + } + } +} diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index c4af207..6dbfb62 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -2,6 +2,7 @@ defmodule Zenohex.NifTest do use ExUnit.Case, async: true alias Zenohex.Nif + alias Zenohex.Sample test "add/2" do assert Nif.add(1, 2) == 3 @@ -108,13 +109,13 @@ defmodule Zenohex.NifTest do {:ok, subscriber} = Nif.declare_subscriber(session, "key/expression") Nif.publisher_put_integer(publisher, 0) - assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:ok, 0} + assert {:ok, %Sample{value: 0}} = Nif.subscriber_recv_timeout(subscriber, 1000) Nif.publisher_put_float(publisher, 0.0) - assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:ok, 0.0} + assert {:ok, %Sample{value: 0.0}} = Nif.subscriber_recv_timeout(subscriber, 1000) Nif.publisher_put_binary(publisher, "binary") - assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:ok, "binary"} + assert {:ok, %Sample{value: "binary"}} = Nif.subscriber_recv_timeout(subscriber, 1000) assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:error, :timeout} end end @@ -138,10 +139,10 @@ defmodule Zenohex.NifTest do {:ok, pull_subscriber} = Nif.declare_pull_subscriber(session, "key/expression") :ok = Nif.publisher_put_integer(publisher, 0) - {:ok, 0} = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) + {:ok, %Sample{value: 0}} = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) {:error, :timeout} = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) assert Nif.pull_subscriber_pull(pull_subscriber) == :ok - assert Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) == {:ok, 0} + assert {:ok, %Sample{value: 0}} = Nif.pull_subscriber_recv_timeout(pull_subscriber, 1000) end end @@ -160,7 +161,7 @@ defmodule Zenohex.NifTest do test "#{test_name}", %{publisher: publisher, subscriber: subscriber} do binary = unquote(binary) Nif.publisher_put_binary(publisher, binary) - assert Nif.subscriber_recv_timeout(subscriber, 1000) == {:ok, binary} + assert {:ok, %Sample{value: ^binary}} = Nif.subscriber_recv_timeout(subscriber, 1000) end end end diff --git a/test/zenohex_test.exs b/test/zenohex_test.exs index 7650904..3d6405a 100644 --- a/test/zenohex_test.exs +++ b/test/zenohex_test.exs @@ -2,6 +2,8 @@ defmodule ZenohexTest do use ExUnit.Case, async: true doctest Zenohex + alias Zenohex.Sample + test "pub/sub" do {:ok, session} = Zenohex.open() {:ok, publisher} = Zenohex.Session.declare_publisher(session, "pub/sub") @@ -11,7 +13,7 @@ defmodule ZenohexTest do :ok = Zenohex.Publisher.put(publisher, "Hello Zenoh Dragon #{i}") assert Zenohex.Subscriber.recv_timeout(subscriber, 1000) == - {:ok, "Hello Zenoh Dragon #{i}"} + {:ok, %Sample{key_expr: "pub/sub", value: "Hello Zenoh Dragon #{i}", kind: :put}} end end end From f8333a00adaf2747236351877f5ca6f904a4e8d2 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 2 Feb 2024 14:23:57 +0900 Subject: [PATCH 057/165] Add `schedule = "DirtyIo"` to NIFs --- native/zenohex_nif/src/lib.rs | 4 ++-- native/zenohex_nif/src/pull_subscriber.rs | 2 +- native/zenohex_nif/src/session.rs | 2 +- native/zenohex_nif/src/subscriber.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 03b8e5a..e4d1f4f 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -44,7 +44,7 @@ fn test_thread(env: Env) -> Atom { atom::ok() } -#[rustler::nif] +#[rustler::nif(schedule = "DirtyIo")] fn zenoh_open() -> Result, String> { let config = config::peer(); match zenoh::open(config).res_sync() { @@ -53,7 +53,7 @@ fn zenoh_open() -> Result, String> { } } -#[rustler::nif] +#[rustler::nif(schedule = "DirtyIo")] fn zenoh_scouting_delay_zero_session() -> Result, String> { let mut config = config::peer(); let config = match config.scouting.set_delay(Some(0)) { diff --git a/native/zenohex_nif/src/pull_subscriber.rs b/native/zenohex_nif/src/pull_subscriber.rs index f2f05b1..2d2b840 100644 --- a/native/zenohex_nif/src/pull_subscriber.rs +++ b/native/zenohex_nif/src/pull_subscriber.rs @@ -4,7 +4,7 @@ use flume::Receiver; use rustler::{types::atom, Encoder, Env, ResourceArc, Term}; use zenoh::{prelude::sync::SyncResolve, sample::Sample, subscriber::PullSubscriber}; -#[rustler::nif] +#[rustler::nif(schedule = "DirtyIo")] fn pull_subscriber_recv_timeout( env: Env, resource: ResourceArc, diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index 89e585a..eed8528 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -66,7 +66,7 @@ fn session_get_reply_receiver( } } -#[rustler::nif] +#[rustler::nif(schedule = "DirtyIo")] fn session_get_reply_timeout( env: Env, resource: ResourceArc, diff --git a/native/zenohex_nif/src/subscriber.rs b/native/zenohex_nif/src/subscriber.rs index bef35a2..dd59b51 100644 --- a/native/zenohex_nif/src/subscriber.rs +++ b/native/zenohex_nif/src/subscriber.rs @@ -4,7 +4,7 @@ use flume::Receiver; use rustler::{Encoder, Env, ResourceArc, Term}; use zenoh::{sample::Sample, subscriber::Subscriber}; -#[rustler::nif] +#[rustler::nif(schedule = "DirtyIo")] fn subscriber_recv_timeout( env: Env, resource: ResourceArc, From edff6eea180b780358473ba07b48d06706ae16b7 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 2 Feb 2024 14:33:36 +0900 Subject: [PATCH 058/165] Add storage example --- lib/zenohex/examples/storage.ex | 21 ++++++++++ lib/zenohex/examples/storage/store.ex | 38 ++++++++++++++++++ lib/zenohex/examples/storage/subscriber.ex | 38 ++++++++++++++++++ lib/zenohex/storage_behaviour.ex | 7 ++++ test/zenohex/examples/storage_test.exs | 45 ++++++++++++++++++++++ 5 files changed, 149 insertions(+) create mode 100644 lib/zenohex/examples/storage.ex create mode 100644 lib/zenohex/examples/storage/store.ex create mode 100644 lib/zenohex/examples/storage/subscriber.ex create mode 100644 lib/zenohex/storage_behaviour.ex create mode 100644 test/zenohex/examples/storage_test.exs diff --git a/lib/zenohex/examples/storage.ex b/lib/zenohex/examples/storage.ex new file mode 100644 index 0000000..fd50e4c --- /dev/null +++ b/lib/zenohex/examples/storage.ex @@ -0,0 +1,21 @@ +defmodule Zenohex.Examples.Storage do + use Supervisor + + alias Zenohex.Examples.Storage + + def start_link(args) when is_map(args) do + Supervisor.start_link(__MODULE__, args, name: __MODULE__) + end + + def init(args) when is_map(args) do + true = Map.has_key?(args, :session) + true = Map.has_key?(args, :key_expr) + + children = [ + {Storage.Store, %{}}, + {Storage.Subscriber, args} + ] + + Supervisor.init(children, strategy: :one_for_one) + end +end diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex new file mode 100644 index 0000000..33469a7 --- /dev/null +++ b/lib/zenohex/examples/storage/store.ex @@ -0,0 +1,38 @@ +defmodule Zenohex.Examples.Storage.Store do + @behaviour Zenohex.StorageBehaviour + + use Agent + + require Logger + + def start_link(initial_state) do + Agent.start_link(fn -> initial_state end, name: __MODULE__) + end + + @impl true + def put(key_expr, sample) do + Agent.update(__MODULE__, fn map -> + Map.put(map, key_expr, sample) + end) + end + + @impl true + def delete(key_expr) do + Agent.update(__MODULE__, fn map -> + Map.delete(map, key_expr) + end) + end + + @impl true + def get(key_expr) do + Agent.get( + __MODULE__, + fn map -> + case Map.get(map, key_expr) do + nil -> {:error, :not_found} + sample -> {:ok, [sample]} + end + end + ) + end +end diff --git a/lib/zenohex/examples/storage/subscriber.ex b/lib/zenohex/examples/storage/subscriber.ex new file mode 100644 index 0000000..82d03eb --- /dev/null +++ b/lib/zenohex/examples/storage/subscriber.ex @@ -0,0 +1,38 @@ +defmodule Zenohex.Examples.Storage.Subscriber do + use GenServer + + require Logger + + alias Zenohex.Session + alias Zenohex.Subscriber + alias Zenohex.Sample + alias Zenohex.Examples.Storage.Store + + def start_link(args) do + GenServer.start_link(__MODULE__, args, name: __MODULE__) + end + + def init(args) do + {:ok, subscriber} = Session.declare_subscriber(args.session, args.key_expr) + send(self(), :loop) + {:ok, %{subscriber: subscriber}} + end + + def handle_info(:loop, state) do + case Subscriber.recv_timeout(state.subscriber, 1000) do + {:ok, sample} -> store(sample) + {:error, :timeout} -> nil + {:error, reason} -> Logger.error(inspect(reason)) + end + + send(self(), :loop) + {:noreply, state} + end + + defp store(sample) when is_struct(sample, Sample) do + case sample.kind do + :put -> Store.put(sample.key_expr, sample) + :delete -> Store.delete(sample.key_expr) + end + end +end diff --git a/lib/zenohex/storage_behaviour.ex b/lib/zenohex/storage_behaviour.ex new file mode 100644 index 0000000..23032fd --- /dev/null +++ b/lib/zenohex/storage_behaviour.ex @@ -0,0 +1,7 @@ +defmodule Zenohex.StorageBehaviour do + alias Zenohex.Sample + + @callback put(key_expr :: String.t(), sample :: Sample.t()) :: :ok | {:error, reason :: any()} + @callback delete(key_expr :: String.t()) :: :ok | {:error, reason :: any()} + @callback get(selector :: String.t()) :: {:ok, [Sample.t()]} | {:error, reason :: any()} +end diff --git a/test/zenohex/examples/storage_test.exs b/test/zenohex/examples/storage_test.exs new file mode 100644 index 0000000..4259804 --- /dev/null +++ b/test/zenohex/examples/storage_test.exs @@ -0,0 +1,45 @@ +defmodule Zenohex.Examples.StorageTest do + use ExUnit.Case + + alias Zenohex.Examples.Storage + alias Zenohex.Session + + setup do + {:ok, session} = Zenohex.open() + start_supervised!({Storage, %{session: session, key_expr: "demo/example/**"}}) + + %{session: session} + end + + test "put", %{session: session} do + key_expr = "demo/example/put" + value = 0 + :ok = Session.put(session, key_expr, value) + + confirm_put(key_expr, value) + end + + test "delete", %{session: session} do + key_expr = "demo/example/delete" + value = 0 + :ok = Session.put(session, key_expr, value) + confirm_put(key_expr, value) + + :ok = Session.delete(session, key_expr) + confirm_delete(key_expr) + end + + defp confirm_put(key_expr, value, retry_count \\ 100) when retry_count > 0 do + case Storage.Store.get(key_expr) do + {:ok, [sample]} -> assert sample.value == value + {:error, :not_found} -> confirm_put(key_expr, value, retry_count - 1) + end + end + + defp confirm_delete(key_expr, retry_count \\ 100) when retry_count > 0 do + case Storage.Store.get(key_expr) do + {:error, :not_found} -> assert true + {:ok, [_sample]} -> confirm_delete(key_expr, retry_count - 1) + end + end +end From 63f8cf5185bd679c13bd2bc6af32bb796ecb29a6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sat, 3 Feb 2024 11:35:23 +0900 Subject: [PATCH 059/165] Add queryable server to storage example --- lib/zenohex/examples/storage.ex | 3 +- lib/zenohex/examples/storage/queryable.ex | 50 +++++++++++++++++++++++ lib/zenohex/examples/storage/store.ex | 4 ++ lib/zenohex/nif.ex | 8 ++++ lib/zenohex/query.ex | 16 +++++++- lib/zenohex/queryable.ex | 20 +++++++++ lib/zenohex/sample.ex | 5 ++- lib/zenohex/session.ex | 18 ++++++++ native/zenohex_nif/src/lib.rs | 6 +++ native/zenohex_nif/src/query.rs | 38 +++++++++++++++++ native/zenohex_nif/src/queryable.rs | 21 ++++++++++ native/zenohex_nif/src/sample.rs | 6 ++- test/zenohex/examples/storage_test.exs | 40 +++++++++++++++--- test/zenohex/queryable_test.exs | 4 ++ test/zenohex_test.exs | 6 ++- 15 files changed, 232 insertions(+), 13 deletions(-) create mode 100644 lib/zenohex/examples/storage/queryable.ex create mode 100644 test/zenohex/queryable_test.exs diff --git a/lib/zenohex/examples/storage.ex b/lib/zenohex/examples/storage.ex index fd50e4c..8806bc4 100644 --- a/lib/zenohex/examples/storage.ex +++ b/lib/zenohex/examples/storage.ex @@ -13,7 +13,8 @@ defmodule Zenohex.Examples.Storage do children = [ {Storage.Store, %{}}, - {Storage.Subscriber, args} + {Storage.Subscriber, args}, + {Storage.Queryable, args} ] Supervisor.init(children, strategy: :one_for_one) diff --git a/lib/zenohex/examples/storage/queryable.ex b/lib/zenohex/examples/storage/queryable.ex new file mode 100644 index 0000000..8a1c649 --- /dev/null +++ b/lib/zenohex/examples/storage/queryable.ex @@ -0,0 +1,50 @@ +defmodule Zenohex.Examples.Storage.Queryable do + use GenServer + + require Logger + + alias Zenohex.Session + alias Zenohex.Queryable + alias Zenohex.Examples.Storage.Store + alias Zenohex.Query + + def start_link(args) do + GenServer.start_link(__MODULE__, args, name: __MODULE__) + end + + def init(args) do + {:ok, queryable} = Session.declare_queryable(args.session, args.key_expr) + send(self(), :loop) + {:ok, %{queryable: queryable}} + end + + def handle_info(:loop, state) do + case Queryable.recv_timeout(state.queryable, 1000) do + {:ok, query} -> + case store(query) do + {:error, :not_found} -> + nil + + {:ok, [sample]} -> + :ok = Query.reply(query, sample) + + # NOTE: It seems that when the query is dropped, the socket is closed and the data is flushed. + # Therefore, it seems necessary to explicitly perform GC of the process and drop the query. + :erlang.garbage_collect() + end + + {:error, :timeout} -> + nil + + {:error, reason} -> + Logger.error(inspect(reason)) + end + + send(self(), :loop) + {:noreply, state} + end + + defp store(query) when is_struct(query, Query) do + Store.get(query.key_expr) + end +end diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index 33469a7..79d3111 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -35,4 +35,8 @@ defmodule Zenohex.Examples.Storage.Store do end ) end + + def dump() do + Agent.get(__MODULE__, fn map -> map end) + end end diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index b866f00..7489445 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -100,4 +100,12 @@ defmodule Zenohex.Nif do def declare_queryable(_session, _key_expr, _opts \\ %Queryable.Options{}) do :erlang.nif_error(:nif_not_loaded) end + + def queryable_recv_timeout(_queryable, _timeout_us) do + :erlang.nif_error(:nif_not_loaded) + end + + def query_reply(_query, _sample) do + :erlang.nif_error(:nif_not_loaded) + end end diff --git a/lib/zenohex/query.ex b/lib/zenohex/query.ex index 1550654..24f653c 100644 --- a/lib/zenohex/query.ex +++ b/lib/zenohex/query.ex @@ -3,7 +3,16 @@ defmodule Zenohex.Query do Documentation for `#{__MODULE__}`. """ - @type t :: reference() + alias Zenohex.Nif + alias Zenohex.Sample + + @type t :: %__MODULE__{ + key_expr: String.t(), + parameters: String.t(), + value: binary() | integer() | float() | nil, + reference: reference() + } + defstruct [:key_expr, :parameters, :value, :reference] defmodule Options do @moduledoc """ @@ -15,4 +24,9 @@ defmodule Zenohex.Query do @type consolidation :: :auto | :none | :monotonic | :latest defstruct target: :best_matching, consolidation: :auto end + + @spec reply(t(), Sample.t()) :: :ok | {:error, reason :: String.t()} + def reply(query, sample) when is_struct(query, __MODULE__) and is_struct(sample, Sample) do + Nif.query_reply(query, sample) + end end diff --git a/lib/zenohex/queryable.ex b/lib/zenohex/queryable.ex index 0bda468..4117b1d 100644 --- a/lib/zenohex/queryable.ex +++ b/lib/zenohex/queryable.ex @@ -3,6 +3,9 @@ defmodule Zenohex.Queryable do Documentation for `#{__MODULE__}`. """ + alias Zenohex.Nif + alias Zenohex.Query + @type t :: reference() defmodule Options do @@ -14,4 +17,21 @@ defmodule Zenohex.Queryable do @type complete :: boolean() defstruct complete: false end + + @doc """ + Receive query. + + ## Examples + + iex> {:ok, session} = Zenohex.open() + iex> {:ok, queryable} = Zenohex.Session.declare_queryable(session, "key/expression") + iex> Zenohex.Queryable.recv_timeout(queryable, 1000) + {:error, :timeout} + """ + @spec recv_timeout(t(), pos_integer()) :: + {:ok, Query.t()} | {:error, :timeout} | {:error, reason :: String.t()} + def recv_timeout(queryable, timeout_us) + when is_reference(queryable) and is_integer(timeout_us) and timeout_us > 0 do + Nif.queryable_recv_timeout(queryable, timeout_us) + end end diff --git a/lib/zenohex/sample.ex b/lib/zenohex/sample.ex index e7fda70..d6d641a 100644 --- a/lib/zenohex/sample.ex +++ b/lib/zenohex/sample.ex @@ -6,7 +6,8 @@ defmodule Zenohex.Sample do @type t :: %__MODULE__{ key_expr: String.t(), value: binary() | integer() | float(), - kind: :put | :delete + kind: :put | :delete, + reference: reference() } - defstruct [:key_expr, :value, :kind] + defstruct [:key_expr, :value, :kind, :reference] end diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex index d541f18..7574309 100644 --- a/lib/zenohex/session.ex +++ b/lib/zenohex/session.ex @@ -101,6 +101,24 @@ defmodule Zenohex.Session do Nif.session_put_float(session, key_expr, value) end + @doc ~S""" + Get data from the matching queryables in the system. + + ## Examples + + iex> {:ok, session} = Zenohex.open() + iex> Zenohex.Session.get_timeout(session, "key/**", 1000) + {:error, :timeout} + """ + @spec get_timeout(t(), String.t(), pos_integer(), Query.Options.t()) :: + {:ok, Sample.t()} | {:error, :timeout} | {:error, reason :: any()} + def get_timeout(session, selector, timeout_us, opts \\ %Query.Options{}) do + case get_reply_receiver(session, selector, opts) do + {:ok, receiver} -> get_reply_timeout(receiver, timeout_us) + error -> error + end + end + @doc ~S""" Get reply receiver from the matching queryables in the system. diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index e4d1f4f..e8c536a 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -31,6 +31,8 @@ pub struct ExSubscriberRef(Subscriber<'static, Receiver>); pub struct ExPullSubscriberRef(PullSubscriber<'static, Receiver>); pub struct ExQueryableRef(Queryable<'static, Receiver>); pub struct ExReplyReceiverRef(Receiver); +pub struct ExQueryRef(Query); +pub struct ExSampleRef(Sample); #[rustler::nif] fn add(a: i64, b: i64) -> i64 { @@ -144,6 +146,8 @@ fn load(env: Env, _term: Term) -> bool { rustler::resource!(ExPullSubscriberRef, env); rustler::resource!(ExQueryableRef, env); rustler::resource!(ExReplyReceiverRef, env); + rustler::resource!(ExQueryRef, env); + rustler::resource!(ExSampleRef, env); true } @@ -173,6 +177,8 @@ rustler::init!( subscriber::subscriber_recv_timeout, pull_subscriber::pull_subscriber_pull, pull_subscriber::pull_subscriber_recv_timeout, + queryable::queryable_recv_timeout, + query::query_reply, ], load = load ); diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs index 4bf4c2a..00ebedc 100644 --- a/native/zenohex_nif/src/query.rs +++ b/native/zenohex_nif/src/query.rs @@ -1,3 +1,41 @@ +use rustler::{types::atom, Encoder, Env, ResourceArc, Term}; +use zenoh::prelude::sync::SyncResolve; + +use crate::ExQueryRef; + +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Query"] +pub struct Query<'a> { + key_expr: String, + parameters: String, + value: Term<'a>, + reference: ResourceArc, +} + +impl Query<'_> { + pub(crate) fn from(env: Env, query: zenoh::queryable::Query) -> Query { + Query { + key_expr: query.key_expr().to_string(), + parameters: query.parameters().to_string(), + value: match query.value() { + Some(value) => crate::value::Value::to_term(env, value), + None => atom::nil().encode(env), + }, + reference: ResourceArc::new(ExQueryRef(query)), + } + } +} + +#[rustler::nif(schedule = "DirtyIo")] +fn query_reply<'a>(env: Env<'a>, query: Query<'a>, sample: crate::sample::Sample<'a>) -> Term<'a> { + let query: &zenoh::queryable::Query = &query.reference.0; + let sample: &zenoh::sample::Sample = &sample.reference.0; + match query.reply(Ok(sample.clone())).res_sync() { + Ok(_) => atom::ok().encode(env), + Err(error) => (atom::error(), error.to_string()).encode(env), + } +} + #[derive(rustler::NifStruct)] #[module = "Zenohex.Query.Options"] pub struct QueryOptions { diff --git a/native/zenohex_nif/src/queryable.rs b/native/zenohex_nif/src/queryable.rs index 33013ea..2fae0c2 100644 --- a/native/zenohex_nif/src/queryable.rs +++ b/native/zenohex_nif/src/queryable.rs @@ -1,3 +1,24 @@ +use std::time::Duration; + +use flume::Receiver; +use rustler::{Encoder, Env, ResourceArc, Term}; +use zenoh::queryable::{Query, Queryable}; + +use crate::{atoms, ExQueryableRef}; + +#[rustler::nif(schedule = "DirtyIo")] +fn queryable_recv_timeout( + env: Env, + resource: ResourceArc, + timeout_us: u64, +) -> Result { + let queryable: &Queryable<'_, Receiver> = &resource.0; + match queryable.recv_timeout(Duration::from_micros(timeout_us)) { + Ok(query) => Ok(crate::query::Query::from(env, query).encode(env)), + Err(_recv_timeout_error) => Err(atoms::timeout().encode(env)), + } +} + #[derive(rustler::NifStruct)] #[module = "Zenohex.Queryable.Options"] pub struct QueryableOptions { diff --git a/native/zenohex_nif/src/sample.rs b/native/zenohex_nif/src/sample.rs index 8bd902b..9b97a0b 100644 --- a/native/zenohex_nif/src/sample.rs +++ b/native/zenohex_nif/src/sample.rs @@ -1,4 +1,6 @@ -use rustler::{Env, Term}; +use rustler::{Env, ResourceArc, Term}; + +use crate::ExSampleRef; #[derive(rustler::NifStruct)] #[module = "Zenohex.Sample"] @@ -6,6 +8,7 @@ pub struct Sample<'a> { pub(crate) key_expr: String, pub(crate) value: Term<'a>, pub(crate) kind: SampleKind, + pub(crate) reference: ResourceArc, } impl Sample<'_> { @@ -14,6 +17,7 @@ impl Sample<'_> { key_expr: sample.key_expr.to_string(), value: crate::value::Value::to_term(env, &sample.value), kind: sample.kind.into(), + reference: ResourceArc::new(ExSampleRef(sample)), } } } diff --git a/test/zenohex/examples/storage_test.exs b/test/zenohex/examples/storage_test.exs index 4259804..602dbda 100644 --- a/test/zenohex/examples/storage_test.exs +++ b/test/zenohex/examples/storage_test.exs @@ -29,17 +29,45 @@ defmodule Zenohex.Examples.StorageTest do confirm_delete(key_expr) end - defp confirm_put(key_expr, value, retry_count \\ 100) when retry_count > 0 do + test "get", %{session: session} do + key_expr = "demo/example/get" + value = 0 + :ok = Session.put(session, key_expr, value) + confirm_put(key_expr, value) + + confirm_get(session, key_expr, value) + end + + defp confirm_put(key_expr, value, retry_count \\ 10) when retry_count > 0 do case Storage.Store.get(key_expr) do - {:ok, [sample]} -> assert sample.value == value - {:error, :not_found} -> confirm_put(key_expr, value, retry_count - 1) + {:ok, [sample]} -> + assert sample.value == value + + {:error, :not_found} -> + Process.sleep(1) + confirm_put(key_expr, value, retry_count - 1) end end - defp confirm_delete(key_expr, retry_count \\ 100) when retry_count > 0 do + defp confirm_delete(key_expr, retry_count \\ 10) when retry_count > 0 do case Storage.Store.get(key_expr) do - {:error, :not_found} -> assert true - {:ok, [_sample]} -> confirm_delete(key_expr, retry_count - 1) + {:error, :not_found} -> + assert true + + {:ok, [_sample]} -> + Process.sleep(1) + confirm_delete(key_expr, retry_count - 1) + end + end + + defp confirm_get(session, key_expr, value, retry_count \\ 10) when retry_count > 0 do + case Session.get_timeout(session, key_expr, 1000) do + {:ok, sample} -> + assert sample.value == value + + {:error, :timeout} -> + Process.sleep(1) + confirm_get(session, key_expr, value, retry_count - 1) end end end diff --git a/test/zenohex/queryable_test.exs b/test/zenohex/queryable_test.exs new file mode 100644 index 0000000..d06eb19 --- /dev/null +++ b/test/zenohex/queryable_test.exs @@ -0,0 +1,4 @@ +defmodule Zenohex.QueryableTest do + use ExUnit.Case, async: true + doctest Zenohex.Queryable +end diff --git a/test/zenohex_test.exs b/test/zenohex_test.exs index 3d6405a..6d25522 100644 --- a/test/zenohex_test.exs +++ b/test/zenohex_test.exs @@ -12,8 +12,10 @@ defmodule ZenohexTest do for i <- 1..100 do :ok = Zenohex.Publisher.put(publisher, "Hello Zenoh Dragon #{i}") - assert Zenohex.Subscriber.recv_timeout(subscriber, 1000) == - {:ok, %Sample{key_expr: "pub/sub", value: "Hello Zenoh Dragon #{i}", kind: :put}} + {:ok, %Sample{key_expr: "pub/sub", value: value, kind: :put}} = + Zenohex.Subscriber.recv_timeout(subscriber, 1000) + + assert value == "Hello Zenoh Dragon #{i}" end end end From 455e743b1642381807794bbce02087e3b382c3fe Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 4 Feb 2024 13:57:23 +0900 Subject: [PATCH 060/165] Update storage example's queryable NOTE --- lib/zenohex/examples/storage/queryable.ex | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/zenohex/examples/storage/queryable.ex b/lib/zenohex/examples/storage/queryable.ex index 8a1c649..2ff7ad7 100644 --- a/lib/zenohex/examples/storage/queryable.ex +++ b/lib/zenohex/examples/storage/queryable.ex @@ -28,8 +28,9 @@ defmodule Zenohex.Examples.Storage.Queryable do {:ok, [sample]} -> :ok = Query.reply(query, sample) - # NOTE: It seems that when the query is dropped, the socket is closed and the data is flushed. - # Therefore, it seems necessary to explicitly perform GC of the process and drop the query. + # NOTE: `send_redponse_final` is invoked When QueryInnter dropped. + # So we need to do GC, which release ResourceArc, to finish the reply. + # ref. https://github.com/eclipse-zenoh/zenoh/blob/0.10.1-rc/zenoh/src/queryable.rs#L55-L69 :erlang.garbage_collect() end From 5dc1599ead9f542fbb5f3adf31864e50cb659049 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 4 Feb 2024 14:19:39 +0900 Subject: [PATCH 061/165] Modify Sample, use ErlOption for reference --- lib/zenohex/sample.ex | 2 +- native/zenohex_nif/src/query.rs | 10 +++++++--- native/zenohex_nif/src/sample.rs | 6 +++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/zenohex/sample.ex b/lib/zenohex/sample.ex index d6d641a..059dd07 100644 --- a/lib/zenohex/sample.ex +++ b/lib/zenohex/sample.ex @@ -7,7 +7,7 @@ defmodule Zenohex.Sample do key_expr: String.t(), value: binary() | integer() | float(), kind: :put | :delete, - reference: reference() + reference: reference() | :undefined } defstruct [:key_expr, :value, :kind, :reference] end diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs index 00ebedc..3eb8df8 100644 --- a/native/zenohex_nif/src/query.rs +++ b/native/zenohex_nif/src/query.rs @@ -1,7 +1,7 @@ use rustler::{types::atom, Encoder, Env, ResourceArc, Term}; use zenoh::prelude::sync::SyncResolve; -use crate::ExQueryRef; +use crate::{ExQueryRef, ExSampleRef}; #[derive(rustler::NifStruct)] #[module = "Zenohex.Query"] @@ -29,8 +29,12 @@ impl Query<'_> { #[rustler::nif(schedule = "DirtyIo")] fn query_reply<'a>(env: Env<'a>, query: Query<'a>, sample: crate::sample::Sample<'a>) -> Term<'a> { let query: &zenoh::queryable::Query = &query.reference.0; - let sample: &zenoh::sample::Sample = &sample.reference.0; - match query.reply(Ok(sample.clone())).res_sync() { + let sample: zenoh::sample::Sample = + match Option::>::from(sample.reference) { + Some(resource) => resource.0.clone(), + None => todo!(), // TODO: Zenoh 外のデータから Sample を作る場合に実装する + }; + match query.reply(Ok(sample)).res_sync() { Ok(_) => atom::ok().encode(env), Err(error) => (atom::error(), error.to_string()).encode(env), } diff --git a/native/zenohex_nif/src/sample.rs b/native/zenohex_nif/src/sample.rs index 9b97a0b..2270489 100644 --- a/native/zenohex_nif/src/sample.rs +++ b/native/zenohex_nif/src/sample.rs @@ -1,4 +1,4 @@ -use rustler::{Env, ResourceArc, Term}; +use rustler::{Env, ErlOption, ResourceArc, Term}; use crate::ExSampleRef; @@ -8,7 +8,7 @@ pub struct Sample<'a> { pub(crate) key_expr: String, pub(crate) value: Term<'a>, pub(crate) kind: SampleKind, - pub(crate) reference: ResourceArc, + pub(crate) reference: ErlOption>, } impl Sample<'_> { @@ -17,7 +17,7 @@ impl Sample<'_> { key_expr: sample.key_expr.to_string(), value: crate::value::Value::to_term(env, &sample.value), kind: sample.kind.into(), - reference: ResourceArc::new(ExSampleRef(sample)), + reference: ErlOption::some(ResourceArc::new(ExSampleRef(sample))), } } } From 037b8378b6214332ae15ab5e9316631292e828e6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 4 Feb 2024 14:44:12 +0900 Subject: [PATCH 062/165] Modify Query struct --- lib/zenohex/query.ex | 2 +- native/zenohex_nif/src/query.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/zenohex/query.ex b/lib/zenohex/query.ex index 24f653c..0300c2d 100644 --- a/lib/zenohex/query.ex +++ b/lib/zenohex/query.ex @@ -9,7 +9,7 @@ defmodule Zenohex.Query do @type t :: %__MODULE__{ key_expr: String.t(), parameters: String.t(), - value: binary() | integer() | float() | nil, + value: binary() | integer() | float() | :undefined, reference: reference() } defstruct [:key_expr, :parameters, :value, :reference] diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs index 3eb8df8..6291a74 100644 --- a/native/zenohex_nif/src/query.rs +++ b/native/zenohex_nif/src/query.rs @@ -1,4 +1,4 @@ -use rustler::{types::atom, Encoder, Env, ResourceArc, Term}; +use rustler::{types::atom, Encoder, Env, ErlOption, ResourceArc, Term}; use zenoh::prelude::sync::SyncResolve; use crate::{ExQueryRef, ExSampleRef}; @@ -8,7 +8,7 @@ use crate::{ExQueryRef, ExSampleRef}; pub struct Query<'a> { key_expr: String, parameters: String, - value: Term<'a>, + value: ErlOption>, reference: ResourceArc, } @@ -18,8 +18,8 @@ impl Query<'_> { key_expr: query.key_expr().to_string(), parameters: query.parameters().to_string(), value: match query.value() { - Some(value) => crate::value::Value::to_term(env, value), - None => atom::nil().encode(env), + Some(value) => ErlOption::some(crate::value::Value::to_term(env, value)), + None => ErlOption::none(), }, reference: ResourceArc::new(ExQueryRef(query)), } From b64eda386044c69ca4a51aa23b11df84423c9f66 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 4 Feb 2024 21:47:27 +0900 Subject: [PATCH 063/165] Refactor zenohex_nif mod --- native/zenohex_nif/src/lib.rs | 88 +++---------------------------- native/zenohex_nif/src/session.rs | 74 +++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 82 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index e8c536a..1bc397a 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -1,15 +1,11 @@ use std::sync::Arc; use flume::Receiver; -use rustler::types::atom; -use rustler::{thread, Encoder}; -use rustler::{Atom, Env, ResourceArc, Term}; -use zenoh::prelude::sync::*; +use rustler::{thread, types::atom, Atom, Encoder, Env, ResourceArc, Term}; use zenoh::{ - publication::Publisher, queryable::Queryable, subscriber::PullSubscriber, - subscriber::Subscriber, Session, + prelude::sync::*, publication::Publisher, query::Reply, queryable::Query, queryable::Queryable, + sample::Sample, subscriber::PullSubscriber, subscriber::Subscriber, Session, }; -use zenoh::{query::Reply, queryable::Query, sample::Sample}; mod atoms { rustler::atoms! { @@ -69,76 +65,6 @@ fn zenoh_scouting_delay_zero_session() -> Result, Stri } } -#[rustler::nif] -fn declare_publisher( - resource: ResourceArc, - key_expr: String, - opts: publisher::PublisherOptions, -) -> Result, String> { - let session: &Arc = &resource.0; - match session - .declare_publisher(key_expr) - .congestion_control(opts.congestion_control.into()) - .priority(opts.priority.into()) - .res_sync() - { - Ok(publisher) => Ok(ResourceArc::new(ExPublisherRef(publisher))), - Err(error) => Err(error.to_string()), - } -} - -#[rustler::nif] -fn declare_subscriber( - resource: ResourceArc, - key_expr: String, - opts: subscriber::SubscriberOptions, -) -> Result, String> { - let session: &Arc = &resource.0; - match session - .declare_subscriber(key_expr) - .reliability(opts.reliability.into()) - .res_sync() - { - Ok(subscriber) => Ok(ResourceArc::new(ExSubscriberRef(subscriber))), - Err(error) => Err(error.to_string()), - } -} - -#[rustler::nif] -fn declare_pull_subscriber( - resource: ResourceArc, - key_expr: String, - opts: subscriber::SubscriberOptions, -) -> Result, String> { - let session: &Arc = &resource.0; - match session - .declare_subscriber(key_expr) - .reliability(opts.reliability.into()) - .pull_mode() - .res_sync() - { - Ok(pull_subscriber) => Ok(ResourceArc::new(ExPullSubscriberRef(pull_subscriber))), - Err(error) => Err(error.to_string()), - } -} - -#[rustler::nif] -fn declare_queryable( - resource: ResourceArc, - key_expr: String, - opts: queryable::QueryableOptions, -) -> Result, String> { - let session: &Arc = &resource.0; - match session - .declare_queryable(key_expr) - .complete(opts.complete) - .res_sync() - { - Ok(queryable) => Ok(ResourceArc::new(ExQueryableRef(queryable))), - Err(error) => Err(error.to_string()), - } -} - fn load(env: Env, _term: Term) -> bool { rustler::resource!(ExSessionRef, env); rustler::resource!(ExPublisherRef, env); @@ -158,10 +84,10 @@ rustler::init!( test_thread, zenoh_open, zenoh_scouting_delay_zero_session, - declare_publisher, - declare_subscriber, - declare_pull_subscriber, - declare_queryable, + session::declare_publisher, + session::declare_subscriber, + session::declare_pull_subscriber, + session::declare_queryable, session::session_put_integer, session::session_put_float, session::session_put_binary, diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index eed8528..9050ae8 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -2,7 +2,79 @@ use std::{sync::Arc, time::Duration}; use flume::Receiver; use rustler::{types::atom, Binary, Encoder, Env, ResourceArc, Term}; -use zenoh::{prelude::sync::SyncResolve, query::Reply, value::Value, Session}; +use zenoh::{prelude::sync::*, query::Reply, value::Value, Session}; + +#[rustler::nif] +fn declare_publisher( + resource: ResourceArc, + key_expr: String, + opts: crate::publisher::PublisherOptions, +) -> Result, String> { + let session: &Arc = &resource.0; + match session + .declare_publisher(key_expr) + .congestion_control(opts.congestion_control.into()) + .priority(opts.priority.into()) + .res_sync() + { + Ok(publisher) => Ok(ResourceArc::new(crate::ExPublisherRef(publisher))), + Err(error) => Err(error.to_string()), + } +} + +#[rustler::nif] +fn declare_subscriber( + resource: ResourceArc, + key_expr: String, + opts: crate::subscriber::SubscriberOptions, +) -> Result, String> { + let session: &Arc = &resource.0; + match session + .declare_subscriber(key_expr) + .reliability(opts.reliability.into()) + .res_sync() + { + Ok(subscriber) => Ok(ResourceArc::new(crate::ExSubscriberRef(subscriber))), + Err(error) => Err(error.to_string()), + } +} + +#[rustler::nif] +fn declare_pull_subscriber( + resource: ResourceArc, + key_expr: String, + opts: crate::subscriber::SubscriberOptions, +) -> Result, String> { + let session: &Arc = &resource.0; + match session + .declare_subscriber(key_expr) + .reliability(opts.reliability.into()) + .pull_mode() + .res_sync() + { + Ok(pull_subscriber) => Ok(ResourceArc::new(crate::ExPullSubscriberRef( + pull_subscriber, + ))), + Err(error) => Err(error.to_string()), + } +} + +#[rustler::nif] +fn declare_queryable( + resource: ResourceArc, + key_expr: String, + opts: crate::queryable::QueryableOptions, +) -> Result, String> { + let session: &Arc = &resource.0; + match session + .declare_queryable(key_expr) + .complete(opts.complete) + .res_sync() + { + Ok(queryable) => Ok(ResourceArc::new(crate::ExQueryableRef(queryable))), + Err(error) => Err(error.to_string()), + } +} #[rustler::nif] fn session_put_integer( From 6aa9f5333b31134ceff342041a6ddfa1176b683c Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Sun, 4 Feb 2024 21:56:34 +0900 Subject: [PATCH 064/165] Remove unused NIFs --- lib/zenohex/nif.ex | 7 ------- native/zenohex_nif/src/lib.rs | 16 +--------------- test/zenohex/nif_test.exs | 10 ---------- 3 files changed, 1 insertion(+), 32 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 7489445..59cfc0c 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -22,13 +22,6 @@ defmodule Zenohex.Nif do alias Zenohex.Queryable alias Zenohex.Query - # When your NIF is loaded, it will override this function. - def add(_a, _b), do: :erlang.nif_error(:nif_not_loaded) - - def test_thread() do - :erlang.nif_error(:nif_not_loaded) - end - def zenoh_open() do :erlang.nif_error(:nif_not_loaded) end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 1bc397a..eff42a5 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use flume::Receiver; -use rustler::{thread, types::atom, Atom, Encoder, Env, ResourceArc, Term}; +use rustler::{Env, ResourceArc, Term}; use zenoh::{ prelude::sync::*, publication::Publisher, query::Reply, queryable::Query, queryable::Queryable, sample::Sample, subscriber::PullSubscriber, subscriber::Subscriber, Session, @@ -30,18 +30,6 @@ pub struct ExReplyReceiverRef(Receiver); pub struct ExQueryRef(Query); pub struct ExSampleRef(Sample); -#[rustler::nif] -fn add(a: i64, b: i64) -> i64 { - a + b -} - -#[rustler::nif] -fn test_thread(env: Env) -> Atom { - let pid = env.pid(); - thread::spawn::(env, move |thread_env| pid.encode(thread_env)); - atom::ok() -} - #[rustler::nif(schedule = "DirtyIo")] fn zenoh_open() -> Result, String> { let config = config::peer(); @@ -80,8 +68,6 @@ fn load(env: Env, _term: Term) -> bool { rustler::init!( "Elixir.Zenohex.Nif", [ - add, - test_thread, zenoh_open, zenoh_scouting_delay_zero_session, session::declare_publisher, diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 6dbfb62..35e8a15 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -4,16 +4,6 @@ defmodule Zenohex.NifTest do alias Zenohex.Nif alias Zenohex.Sample - test "add/2" do - assert Nif.add(1, 2) == 3 - end - - test "test_thread/0" do - pid = self() - assert Nif.test_thread() == :ok - assert_receive ^pid - end - setup_all do {:ok, session} = Nif.zenoh_open() %{session: session} From a1ec9aab70f2c52a19beaf9da649aaa46337247b Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 5 Feb 2024 17:12:07 +0900 Subject: [PATCH 065/165] Fix visibility of zenohex_nif --- native/zenohex_nif/src/lib.rs | 16 ++++++++-------- native/zenohex_nif/src/publisher.rs | 6 +++--- native/zenohex_nif/src/query.rs | 8 ++++---- native/zenohex_nif/src/queryable.rs | 2 +- native/zenohex_nif/src/sample.rs | 4 ++-- native/zenohex_nif/src/subscriber.rs | 4 ++-- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index eff42a5..54368e1 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -21,14 +21,14 @@ mod session; mod subscriber; mod value; -pub struct ExSessionRef(Arc); -pub struct ExPublisherRef(Publisher<'static>); -pub struct ExSubscriberRef(Subscriber<'static, Receiver>); -pub struct ExPullSubscriberRef(PullSubscriber<'static, Receiver>); -pub struct ExQueryableRef(Queryable<'static, Receiver>); -pub struct ExReplyReceiverRef(Receiver); -pub struct ExQueryRef(Query); -pub struct ExSampleRef(Sample); +struct ExSessionRef(Arc); +struct ExPublisherRef(Publisher<'static>); +struct ExSubscriberRef(Subscriber<'static, Receiver>); +struct ExPullSubscriberRef(PullSubscriber<'static, Receiver>); +struct ExQueryableRef(Queryable<'static, Receiver>); +struct ExReplyReceiverRef(Receiver); +struct ExQueryRef(Query); +struct ExSampleRef(Sample); #[rustler::nif(schedule = "DirtyIo")] fn zenoh_open() -> Result, String> { diff --git a/native/zenohex_nif/src/publisher.rs b/native/zenohex_nif/src/publisher.rs index 05ce1c0..f76f0f1 100644 --- a/native/zenohex_nif/src/publisher.rs +++ b/native/zenohex_nif/src/publisher.rs @@ -66,13 +66,13 @@ fn publisher_priority( #[derive(rustler::NifStruct)] #[module = "Zenohex.Publisher.Options"] -pub struct PublisherOptions { +pub(crate) struct PublisherOptions { pub(crate) congestion_control: CongestionControl, pub(crate) priority: Priority, } #[derive(rustler::NifUnitEnum)] -pub enum CongestionControl { +pub(crate) enum CongestionControl { Drop, Block, } @@ -87,7 +87,7 @@ impl From for zenoh::publication::CongestionControl { } #[derive(rustler::NifUnitEnum)] -pub enum Priority { +pub(crate) enum Priority { RealTime, InteractiveHigh, InteractiveLow, diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs index 6291a74..73a8b08 100644 --- a/native/zenohex_nif/src/query.rs +++ b/native/zenohex_nif/src/query.rs @@ -5,7 +5,7 @@ use crate::{ExQueryRef, ExSampleRef}; #[derive(rustler::NifStruct)] #[module = "Zenohex.Query"] -pub struct Query<'a> { +pub(crate) struct Query<'a> { key_expr: String, parameters: String, value: ErlOption>, @@ -42,13 +42,13 @@ fn query_reply<'a>(env: Env<'a>, query: Query<'a>, sample: crate::sample::Sample #[derive(rustler::NifStruct)] #[module = "Zenohex.Query.Options"] -pub struct QueryOptions { +pub(crate) struct QueryOptions { pub(crate) target: QueryTarget, pub(crate) consolidation: ConsolidationMode, } #[derive(rustler::NifUnitEnum)] -pub enum QueryTarget { +pub(crate) enum QueryTarget { BestMatching, All, AllComplete, @@ -65,7 +65,7 @@ impl From for zenoh::query::QueryTarget { } #[derive(rustler::NifUnitEnum)] -pub enum ConsolidationMode { +pub(crate) enum ConsolidationMode { Auto, None, Monotonic, diff --git a/native/zenohex_nif/src/queryable.rs b/native/zenohex_nif/src/queryable.rs index 2fae0c2..e3b5819 100644 --- a/native/zenohex_nif/src/queryable.rs +++ b/native/zenohex_nif/src/queryable.rs @@ -21,6 +21,6 @@ fn queryable_recv_timeout( #[derive(rustler::NifStruct)] #[module = "Zenohex.Queryable.Options"] -pub struct QueryableOptions { +pub(crate) struct QueryableOptions { pub(crate) complete: bool, } diff --git a/native/zenohex_nif/src/sample.rs b/native/zenohex_nif/src/sample.rs index 2270489..25f1c74 100644 --- a/native/zenohex_nif/src/sample.rs +++ b/native/zenohex_nif/src/sample.rs @@ -4,7 +4,7 @@ use crate::ExSampleRef; #[derive(rustler::NifStruct)] #[module = "Zenohex.Sample"] -pub struct Sample<'a> { +pub(crate) struct Sample<'a> { pub(crate) key_expr: String, pub(crate) value: Term<'a>, pub(crate) kind: SampleKind, @@ -23,7 +23,7 @@ impl Sample<'_> { } #[derive(rustler::NifUnitEnum)] -pub enum SampleKind { +pub(crate) enum SampleKind { Put, Delete, } diff --git a/native/zenohex_nif/src/subscriber.rs b/native/zenohex_nif/src/subscriber.rs index dd59b51..d8ef6fa 100644 --- a/native/zenohex_nif/src/subscriber.rs +++ b/native/zenohex_nif/src/subscriber.rs @@ -19,12 +19,12 @@ fn subscriber_recv_timeout( #[derive(rustler::NifStruct)] #[module = "Zenohex.Subscriber.Options"] -pub struct SubscriberOptions { +pub(crate) struct SubscriberOptions { pub(crate) reliability: Reliability, } #[derive(rustler::NifUnitEnum)] -pub enum Reliability { +pub(crate) enum Reliability { BestEffort, Reliable, } From c52f44f36606329d024c31b99afbded71eac10c3 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 6 Feb 2024 10:42:24 +0900 Subject: [PATCH 066/165] Add finish_reply/1 to Zenohex.Query --- lib/zenohex/examples/storage/queryable.ex | 8 ++--- lib/zenohex/nif.ex | 4 +++ lib/zenohex/query.ex | 5 +++ native/zenohex_nif/src/lib.rs | 5 +-- native/zenohex_nif/src/query.rs | 44 +++++++++++++++++++++-- 5 files changed, 57 insertions(+), 9 deletions(-) diff --git a/lib/zenohex/examples/storage/queryable.ex b/lib/zenohex/examples/storage/queryable.ex index 2ff7ad7..067c322 100644 --- a/lib/zenohex/examples/storage/queryable.ex +++ b/lib/zenohex/examples/storage/queryable.ex @@ -27,11 +27,9 @@ defmodule Zenohex.Examples.Storage.Queryable do {:ok, [sample]} -> :ok = Query.reply(query, sample) - - # NOTE: `send_redponse_final` is invoked When QueryInnter dropped. - # So we need to do GC, which release ResourceArc, to finish the reply. - # ref. https://github.com/eclipse-zenoh/zenoh/blob/0.10.1-rc/zenoh/src/queryable.rs#L55-L69 - :erlang.garbage_collect() + :ok = Query.finish_reply(query) + # following line is not needed, this is just example of double call + {:error, "ResponseFinal has already been sent"} = Query.finish_reply(query) end {:error, :timeout} -> diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index 59cfc0c..be26ca8 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -101,4 +101,8 @@ defmodule Zenohex.Nif do def query_reply(_query, _sample) do :erlang.nif_error(:nif_not_loaded) end + + def query_finish_reply(_query) do + :erlang.nif_error(:nif_not_loaded) + end end diff --git a/lib/zenohex/query.ex b/lib/zenohex/query.ex index 0300c2d..0e64df9 100644 --- a/lib/zenohex/query.ex +++ b/lib/zenohex/query.ex @@ -29,4 +29,9 @@ defmodule Zenohex.Query do def reply(query, sample) when is_struct(query, __MODULE__) and is_struct(sample, Sample) do Nif.query_reply(query, sample) end + + @spec finish_reply(t()) :: :ok | {:error, reason :: String.t()} + def finish_reply(query) when is_struct(query, __MODULE__) do + Nif.query_finish_reply(query) + end end diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index 54368e1..fb76cbf 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::sync::{Arc, RwLock}; use flume::Receiver; use rustler::{Env, ResourceArc, Term}; @@ -27,7 +27,7 @@ struct ExSubscriberRef(Subscriber<'static, Receiver>); struct ExPullSubscriberRef(PullSubscriber<'static, Receiver>); struct ExQueryableRef(Queryable<'static, Receiver>); struct ExReplyReceiverRef(Receiver); -struct ExQueryRef(Query); +struct ExQueryRef(RwLock>); struct ExSampleRef(Sample); #[rustler::nif(schedule = "DirtyIo")] @@ -91,6 +91,7 @@ rustler::init!( pull_subscriber::pull_subscriber_recv_timeout, queryable::queryable_recv_timeout, query::query_reply, + query::query_finish_reply, ], load = load ); diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs index 73a8b08..ccce91c 100644 --- a/native/zenohex_nif/src/query.rs +++ b/native/zenohex_nif/src/query.rs @@ -1,3 +1,5 @@ +use std::sync::RwLock; + use rustler::{types::atom, Encoder, Env, ErlOption, ResourceArc, Term}; use zenoh::prelude::sync::SyncResolve; @@ -21,14 +23,28 @@ impl Query<'_> { Some(value) => ErlOption::some(crate::value::Value::to_term(env, value)), None => ErlOption::none(), }, - reference: ResourceArc::new(ExQueryRef(query)), + reference: ResourceArc::new(ExQueryRef(RwLock::new(Some(query)))), } } } #[rustler::nif(schedule = "DirtyIo")] fn query_reply<'a>(env: Env<'a>, query: Query<'a>, sample: crate::sample::Sample<'a>) -> Term<'a> { - let query: &zenoh::queryable::Query = &query.reference.0; + let lock: &RwLock> = &query.reference.0; + let guard = match lock.read() { + Ok(guard) => guard, + Err(error) => return (atom::error(), error.to_string()).encode(env), + }; + let query: &zenoh::queryable::Query = match &*guard { + Some(query) => query, + None => { + return ( + atom::error(), + "ResponseFinal has already been sent".to_string(), + ) + .encode(env) + } + }; let sample: zenoh::sample::Sample = match Option::>::from(sample.reference) { Some(resource) => resource.0.clone(), @@ -40,6 +56,30 @@ fn query_reply<'a>(env: Env<'a>, query: Query<'a>, sample: crate::sample::Sample } } +#[rustler::nif(schedule = "DirtyIo")] +fn query_finish_reply<'a>(env: Env<'a>, query: Query<'a>) -> Term<'a> { + let lock: &RwLock> = &query.reference.0; + let mut guard = match lock.write() { + Ok(guard) => guard, + Err(error) => return (atom::error(), error.to_string()).encode(env), + }; + match Option::take(&mut *guard) { + Some(query) => { + // When Query drops, ResponseFinal is sent. + // So we need to drop the query at the end of the reply by calling this function. + drop(query); + atom::ok().encode(env) + } + None => { + return ( + atom::error(), + "ResponseFinal has already been sent".to_string(), + ) + .encode(env) + } + } +} + #[derive(rustler::NifStruct)] #[module = "Zenohex.Query.Options"] pub(crate) struct QueryOptions { From 31b12127dd7fa03cf7a2bfa42a3120aec2919893 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 6 Feb 2024 11:20:09 +0900 Subject: [PATCH 067/165] Rename Ex...Ref name with ...Ref --- native/zenohex_nif/src/lib.rs | 40 ++++++++++----------- native/zenohex_nif/src/publisher.rs | 24 ++++++------- native/zenohex_nif/src/pull_subscriber.rs | 4 +-- native/zenohex_nif/src/query.rs | 8 ++--- native/zenohex_nif/src/queryable.rs | 4 +-- native/zenohex_nif/src/sample.rs | 6 ++-- native/zenohex_nif/src/session.rs | 44 +++++++++++------------ native/zenohex_nif/src/subscriber.rs | 2 +- 8 files changed, 65 insertions(+), 67 deletions(-) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index fb76cbf..faecfeb 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -21,26 +21,26 @@ mod session; mod subscriber; mod value; -struct ExSessionRef(Arc); -struct ExPublisherRef(Publisher<'static>); -struct ExSubscriberRef(Subscriber<'static, Receiver>); -struct ExPullSubscriberRef(PullSubscriber<'static, Receiver>); -struct ExQueryableRef(Queryable<'static, Receiver>); -struct ExReplyReceiverRef(Receiver); -struct ExQueryRef(RwLock>); -struct ExSampleRef(Sample); +struct SessionRef(Arc); +struct PublisherRef(Publisher<'static>); +struct SubscriberRef(Subscriber<'static, Receiver>); +struct PullSubscriberRef(PullSubscriber<'static, Receiver>); +struct QueryableRef(Queryable<'static, Receiver>); +struct ReplyReceiverRef(Receiver); +struct QueryRef(RwLock>); +struct SampleRef(Sample); #[rustler::nif(schedule = "DirtyIo")] -fn zenoh_open() -> Result, String> { +fn zenoh_open() -> Result, String> { let config = config::peer(); match zenoh::open(config).res_sync() { - Ok(session) => Ok(ResourceArc::new(ExSessionRef(session.into_arc()))), + Ok(session) => Ok(ResourceArc::new(SessionRef(session.into_arc()))), Err(error) => Err(error.to_string()), } } #[rustler::nif(schedule = "DirtyIo")] -fn zenoh_scouting_delay_zero_session() -> Result, String> { +fn zenoh_scouting_delay_zero_session() -> Result, String> { let mut config = config::peer(); let config = match config.scouting.set_delay(Some(0)) { Ok(_) => config, @@ -48,20 +48,20 @@ fn zenoh_scouting_delay_zero_session() -> Result, Stri }; match zenoh::open(config).res_sync() { - Ok(session) => Ok(ResourceArc::new(ExSessionRef(session.into_arc()))), + Ok(session) => Ok(ResourceArc::new(SessionRef(session.into_arc()))), Err(error) => Err(error.to_string()), } } fn load(env: Env, _term: Term) -> bool { - rustler::resource!(ExSessionRef, env); - rustler::resource!(ExPublisherRef, env); - rustler::resource!(ExSubscriberRef, env); - rustler::resource!(ExPullSubscriberRef, env); - rustler::resource!(ExQueryableRef, env); - rustler::resource!(ExReplyReceiverRef, env); - rustler::resource!(ExQueryRef, env); - rustler::resource!(ExSampleRef, env); + rustler::resource!(SessionRef, env); + rustler::resource!(PublisherRef, env); + rustler::resource!(SubscriberRef, env); + rustler::resource!(PullSubscriberRef, env); + rustler::resource!(QueryableRef, env); + rustler::resource!(ReplyReceiverRef, env); + rustler::resource!(QueryRef, env); + rustler::resource!(SampleRef, env); true } diff --git a/native/zenohex_nif/src/publisher.rs b/native/zenohex_nif/src/publisher.rs index f76f0f1..fcfda84 100644 --- a/native/zenohex_nif/src/publisher.rs +++ b/native/zenohex_nif/src/publisher.rs @@ -1,21 +1,21 @@ -use crate::ExPublisherRef; +use crate::PublisherRef; use rustler::{types::atom, Binary, Encoder, Env, ResourceArc, Term}; use zenoh::{prelude::sync::SyncResolve, publication::Publisher, value::Value}; #[rustler::nif] -fn publisher_put_integer(env: Env, resource: ResourceArc, value: i64) -> Term { +fn publisher_put_integer(env: Env, resource: ResourceArc, value: i64) -> Term { publisher_put_impl(env, resource, value) } #[rustler::nif] -fn publisher_put_float(env: Env, resource: ResourceArc, value: f64) -> Term { +fn publisher_put_float(env: Env, resource: ResourceArc, value: f64) -> Term { publisher_put_impl(env, resource, value) } #[rustler::nif] fn publisher_put_binary<'a>( env: Env<'a>, - resource: ResourceArc, + resource: ResourceArc, value: Binary<'a>, ) -> Term<'a> { publisher_put_impl(env, resource, Value::from(value.as_slice())) @@ -23,7 +23,7 @@ fn publisher_put_binary<'a>( fn publisher_put_impl>( env: Env, - resource: ResourceArc, + resource: ResourceArc, value: T, ) -> Term { let publisher: &Publisher = &resource.0; @@ -34,7 +34,7 @@ fn publisher_put_impl>( } #[rustler::nif] -fn publisher_delete(env: Env, resource: ResourceArc) -> Term { +fn publisher_delete(env: Env, resource: ResourceArc) -> Term { let publisher: &Publisher = &resource.0; match publisher.delete().res_sync() { Ok(_) => atom::ok().encode(env), @@ -44,24 +44,24 @@ fn publisher_delete(env: Env, resource: ResourceArc) -> Term { #[rustler::nif] fn publisher_congestion_control( - resource: ResourceArc, + resource: ResourceArc, value: CongestionControl, -) -> ResourceArc { +) -> ResourceArc { let publisher: &Publisher = &resource.0; let publisher: Publisher = publisher.clone().congestion_control(value.into()); - ResourceArc::new(ExPublisherRef(publisher)) + ResourceArc::new(PublisherRef(publisher)) } #[rustler::nif] fn publisher_priority( - resource: ResourceArc, + resource: ResourceArc, value: Priority, -) -> ResourceArc { +) -> ResourceArc { let publisher: &Publisher = &resource.0; let publisher: Publisher = publisher.clone().priority(value.into()); - ResourceArc::new(ExPublisherRef(publisher)) + ResourceArc::new(PublisherRef(publisher)) } #[derive(rustler::NifStruct)] diff --git a/native/zenohex_nif/src/pull_subscriber.rs b/native/zenohex_nif/src/pull_subscriber.rs index 2d2b840..98cdd9b 100644 --- a/native/zenohex_nif/src/pull_subscriber.rs +++ b/native/zenohex_nif/src/pull_subscriber.rs @@ -7,7 +7,7 @@ use zenoh::{prelude::sync::SyncResolve, sample::Sample, subscriber::PullSubscrib #[rustler::nif(schedule = "DirtyIo")] fn pull_subscriber_recv_timeout( env: Env, - resource: ResourceArc, + resource: ResourceArc, timeout_us: u64, ) -> Result { let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; @@ -18,7 +18,7 @@ fn pull_subscriber_recv_timeout( } #[rustler::nif] -fn pull_subscriber_pull(env: Env, resource: ResourceArc) -> Term { +fn pull_subscriber_pull(env: Env, resource: ResourceArc) -> Term { let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; match pull_subscriber.pull().res_sync() { Ok(_) => atom::ok().encode(env), diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs index ccce91c..54750db 100644 --- a/native/zenohex_nif/src/query.rs +++ b/native/zenohex_nif/src/query.rs @@ -3,7 +3,7 @@ use std::sync::RwLock; use rustler::{types::atom, Encoder, Env, ErlOption, ResourceArc, Term}; use zenoh::prelude::sync::SyncResolve; -use crate::{ExQueryRef, ExSampleRef}; +use crate::{QueryRef, SampleRef}; #[derive(rustler::NifStruct)] #[module = "Zenohex.Query"] @@ -11,7 +11,7 @@ pub(crate) struct Query<'a> { key_expr: String, parameters: String, value: ErlOption>, - reference: ResourceArc, + reference: ResourceArc, } impl Query<'_> { @@ -23,7 +23,7 @@ impl Query<'_> { Some(value) => ErlOption::some(crate::value::Value::to_term(env, value)), None => ErlOption::none(), }, - reference: ResourceArc::new(ExQueryRef(RwLock::new(Some(query)))), + reference: ResourceArc::new(QueryRef(RwLock::new(Some(query)))), } } } @@ -46,7 +46,7 @@ fn query_reply<'a>(env: Env<'a>, query: Query<'a>, sample: crate::sample::Sample } }; let sample: zenoh::sample::Sample = - match Option::>::from(sample.reference) { + match Option::>::from(sample.reference) { Some(resource) => resource.0.clone(), None => todo!(), // TODO: Zenoh 外のデータから Sample を作る場合に実装する }; diff --git a/native/zenohex_nif/src/queryable.rs b/native/zenohex_nif/src/queryable.rs index e3b5819..c3d50d1 100644 --- a/native/zenohex_nif/src/queryable.rs +++ b/native/zenohex_nif/src/queryable.rs @@ -4,12 +4,12 @@ use flume::Receiver; use rustler::{Encoder, Env, ResourceArc, Term}; use zenoh::queryable::{Query, Queryable}; -use crate::{atoms, ExQueryableRef}; +use crate::{atoms, QueryableRef}; #[rustler::nif(schedule = "DirtyIo")] fn queryable_recv_timeout( env: Env, - resource: ResourceArc, + resource: ResourceArc, timeout_us: u64, ) -> Result { let queryable: &Queryable<'_, Receiver> = &resource.0; diff --git a/native/zenohex_nif/src/sample.rs b/native/zenohex_nif/src/sample.rs index 25f1c74..8f535b7 100644 --- a/native/zenohex_nif/src/sample.rs +++ b/native/zenohex_nif/src/sample.rs @@ -1,6 +1,6 @@ use rustler::{Env, ErlOption, ResourceArc, Term}; -use crate::ExSampleRef; +use crate::SampleRef; #[derive(rustler::NifStruct)] #[module = "Zenohex.Sample"] @@ -8,7 +8,7 @@ pub(crate) struct Sample<'a> { pub(crate) key_expr: String, pub(crate) value: Term<'a>, pub(crate) kind: SampleKind, - pub(crate) reference: ErlOption>, + pub(crate) reference: ErlOption>, } impl Sample<'_> { @@ -17,7 +17,7 @@ impl Sample<'_> { key_expr: sample.key_expr.to_string(), value: crate::value::Value::to_term(env, &sample.value), kind: sample.kind.into(), - reference: ErlOption::some(ResourceArc::new(ExSampleRef(sample))), + reference: ErlOption::some(ResourceArc::new(SampleRef(sample))), } } } diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index 9050ae8..8d5946b 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -6,10 +6,10 @@ use zenoh::{prelude::sync::*, query::Reply, value::Value, Session}; #[rustler::nif] fn declare_publisher( - resource: ResourceArc, + resource: ResourceArc, key_expr: String, opts: crate::publisher::PublisherOptions, -) -> Result, String> { +) -> Result, String> { let session: &Arc = &resource.0; match session .declare_publisher(key_expr) @@ -17,34 +17,34 @@ fn declare_publisher( .priority(opts.priority.into()) .res_sync() { - Ok(publisher) => Ok(ResourceArc::new(crate::ExPublisherRef(publisher))), + Ok(publisher) => Ok(ResourceArc::new(crate::PublisherRef(publisher))), Err(error) => Err(error.to_string()), } } #[rustler::nif] fn declare_subscriber( - resource: ResourceArc, + resource: ResourceArc, key_expr: String, opts: crate::subscriber::SubscriberOptions, -) -> Result, String> { +) -> Result, String> { let session: &Arc = &resource.0; match session .declare_subscriber(key_expr) .reliability(opts.reliability.into()) .res_sync() { - Ok(subscriber) => Ok(ResourceArc::new(crate::ExSubscriberRef(subscriber))), + Ok(subscriber) => Ok(ResourceArc::new(crate::SubscriberRef(subscriber))), Err(error) => Err(error.to_string()), } } #[rustler::nif] fn declare_pull_subscriber( - resource: ResourceArc, + resource: ResourceArc, key_expr: String, opts: crate::subscriber::SubscriberOptions, -) -> Result, String> { +) -> Result, String> { let session: &Arc = &resource.0; match session .declare_subscriber(key_expr) @@ -52,26 +52,24 @@ fn declare_pull_subscriber( .pull_mode() .res_sync() { - Ok(pull_subscriber) => Ok(ResourceArc::new(crate::ExPullSubscriberRef( - pull_subscriber, - ))), + Ok(pull_subscriber) => Ok(ResourceArc::new(crate::PullSubscriberRef(pull_subscriber))), Err(error) => Err(error.to_string()), } } #[rustler::nif] fn declare_queryable( - resource: ResourceArc, + resource: ResourceArc, key_expr: String, opts: crate::queryable::QueryableOptions, -) -> Result, String> { +) -> Result, String> { let session: &Arc = &resource.0; match session .declare_queryable(key_expr) .complete(opts.complete) .res_sync() { - Ok(queryable) => Ok(ResourceArc::new(crate::ExQueryableRef(queryable))), + Ok(queryable) => Ok(ResourceArc::new(crate::QueryableRef(queryable))), Err(error) => Err(error.to_string()), } } @@ -79,7 +77,7 @@ fn declare_queryable( #[rustler::nif] fn session_put_integer( env: Env, - resource: ResourceArc, + resource: ResourceArc, key_expr: String, value: i64, ) -> Term { @@ -89,7 +87,7 @@ fn session_put_integer( #[rustler::nif] fn session_put_float( env: Env, - resource: ResourceArc, + resource: ResourceArc, key_expr: String, value: f64, ) -> Term { @@ -99,7 +97,7 @@ fn session_put_float( #[rustler::nif] fn session_put_binary<'a>( env: Env<'a>, - resource: ResourceArc, + resource: ResourceArc, key_expr: String, value: Binary<'a>, ) -> Term<'a> { @@ -108,7 +106,7 @@ fn session_put_binary<'a>( fn session_put_impl>( env: Env, - resource: ResourceArc, + resource: ResourceArc, key_expr: String, value: T, ) -> Term { @@ -121,10 +119,10 @@ fn session_put_impl>( #[rustler::nif] fn session_get_reply_receiver( - resource: ResourceArc, + resource: ResourceArc, selector: String, opts: crate::query::QueryOptions, -) -> Result, String> { +) -> Result, String> { let session: &Arc = &resource.0; // TODO: with_value の実装は用途が出てきたら検討 match session @@ -133,7 +131,7 @@ fn session_get_reply_receiver( .consolidation(opts.consolidation) .res_sync() { - Ok(receiver) => Ok(ResourceArc::new(crate::ExReplyReceiverRef(receiver))), + Ok(receiver) => Ok(ResourceArc::new(crate::ReplyReceiverRef(receiver))), Err(error) => Err(error.to_string()), } } @@ -141,7 +139,7 @@ fn session_get_reply_receiver( #[rustler::nif(schedule = "DirtyIo")] fn session_get_reply_timeout( env: Env, - resource: ResourceArc, + resource: ResourceArc, timeout_us: u64, ) -> Result { let receiver: &Receiver = &resource.0; @@ -155,7 +153,7 @@ fn session_get_reply_timeout( } #[rustler::nif] -fn session_delete(env: Env, resource: ResourceArc, key_expr: String) -> Term { +fn session_delete(env: Env, resource: ResourceArc, key_expr: String) -> Term { let session: &Arc = &resource.0; match session.delete(key_expr).res_sync() { Ok(_) => atom::ok().encode(env), diff --git a/native/zenohex_nif/src/subscriber.rs b/native/zenohex_nif/src/subscriber.rs index d8ef6fa..8f97dbe 100644 --- a/native/zenohex_nif/src/subscriber.rs +++ b/native/zenohex_nif/src/subscriber.rs @@ -7,7 +7,7 @@ use zenoh::{sample::Sample, subscriber::Subscriber}; #[rustler::nif(schedule = "DirtyIo")] fn subscriber_recv_timeout( env: Env, - resource: ResourceArc, + resource: ResourceArc, timeout_us: u64, ) -> Result { let subscriber: &Subscriber<'_, Receiver> = &resource.0; From 2e2d7b34106e24343418a7eeba4e161b9f8a969d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 6 Feb 2024 12:12:23 +0900 Subject: [PATCH 068/165] Refactor zenohex_nif variable names --- native/zenohex_nif/src/publisher.rs | 40 +++++++++--------- native/zenohex_nif/src/pull_subscriber.rs | 2 +- native/zenohex_nif/src/query.rs | 50 ++++++++++++----------- native/zenohex_nif/src/queryable.rs | 4 +- native/zenohex_nif/src/sample.rs | 20 ++++----- native/zenohex_nif/src/session.rs | 10 ++--- native/zenohex_nif/src/subscriber.rs | 14 +++---- native/zenohex_nif/src/value.rs | 6 +-- 8 files changed, 75 insertions(+), 71 deletions(-) diff --git a/native/zenohex_nif/src/publisher.rs b/native/zenohex_nif/src/publisher.rs index fcfda84..e4e0754 100644 --- a/native/zenohex_nif/src/publisher.rs +++ b/native/zenohex_nif/src/publisher.rs @@ -45,7 +45,7 @@ fn publisher_delete(env: Env, resource: ResourceArc) -> Term { #[rustler::nif] fn publisher_congestion_control( resource: ResourceArc, - value: CongestionControl, + value: ExCongestionControl, ) -> ResourceArc { let publisher: &Publisher = &resource.0; let publisher: Publisher = publisher.clone().congestion_control(value.into()); @@ -56,7 +56,7 @@ fn publisher_congestion_control( #[rustler::nif] fn publisher_priority( resource: ResourceArc, - value: Priority, + value: ExPriority, ) -> ResourceArc { let publisher: &Publisher = &resource.0; let publisher: Publisher = publisher.clone().priority(value.into()); @@ -66,28 +66,28 @@ fn publisher_priority( #[derive(rustler::NifStruct)] #[module = "Zenohex.Publisher.Options"] -pub(crate) struct PublisherOptions { - pub(crate) congestion_control: CongestionControl, - pub(crate) priority: Priority, +pub(crate) struct ExPublisherOptions { + pub(crate) congestion_control: ExCongestionControl, + pub(crate) priority: ExPriority, } #[derive(rustler::NifUnitEnum)] -pub(crate) enum CongestionControl { +pub(crate) enum ExCongestionControl { Drop, Block, } -impl From for zenoh::publication::CongestionControl { - fn from(value: CongestionControl) -> Self { +impl From for zenoh::publication::CongestionControl { + fn from(value: ExCongestionControl) -> Self { match value { - CongestionControl::Drop => zenoh::publication::CongestionControl::Drop, - CongestionControl::Block => zenoh::publication::CongestionControl::Block, + ExCongestionControl::Drop => zenoh::publication::CongestionControl::Drop, + ExCongestionControl::Block => zenoh::publication::CongestionControl::Block, } } } #[derive(rustler::NifUnitEnum)] -pub(crate) enum Priority { +pub(crate) enum ExPriority { RealTime, InteractiveHigh, InteractiveLow, @@ -97,16 +97,16 @@ pub(crate) enum Priority { Background, } -impl From for zenoh::publication::Priority { - fn from(value: Priority) -> Self { +impl From for zenoh::publication::Priority { + fn from(value: ExPriority) -> Self { match value { - Priority::RealTime => zenoh::publication::Priority::RealTime, - Priority::InteractiveHigh => zenoh::publication::Priority::InteractiveHigh, - Priority::InteractiveLow => zenoh::publication::Priority::InteractiveLow, - Priority::DataHigh => zenoh::publication::Priority::DataHigh, - Priority::Data => zenoh::publication::Priority::Data, - Priority::DataLow => zenoh::publication::Priority::DataLow, - Priority::Background => zenoh::publication::Priority::Background, + ExPriority::RealTime => zenoh::publication::Priority::RealTime, + ExPriority::InteractiveHigh => zenoh::publication::Priority::InteractiveHigh, + ExPriority::InteractiveLow => zenoh::publication::Priority::InteractiveLow, + ExPriority::DataHigh => zenoh::publication::Priority::DataHigh, + ExPriority::Data => zenoh::publication::Priority::Data, + ExPriority::DataLow => zenoh::publication::Priority::DataLow, + ExPriority::Background => zenoh::publication::Priority::Background, } } } diff --git a/native/zenohex_nif/src/pull_subscriber.rs b/native/zenohex_nif/src/pull_subscriber.rs index 98cdd9b..6002c6d 100644 --- a/native/zenohex_nif/src/pull_subscriber.rs +++ b/native/zenohex_nif/src/pull_subscriber.rs @@ -12,7 +12,7 @@ fn pull_subscriber_recv_timeout( ) -> Result { let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; match pull_subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => Ok(crate::sample::Sample::from(env, sample).encode(env)), + Ok(sample) => Ok(crate::sample::ExSample::from(env, sample).encode(env)), Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } } diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs index 54750db..4223953 100644 --- a/native/zenohex_nif/src/query.rs +++ b/native/zenohex_nif/src/query.rs @@ -7,20 +7,20 @@ use crate::{QueryRef, SampleRef}; #[derive(rustler::NifStruct)] #[module = "Zenohex.Query"] -pub(crate) struct Query<'a> { +pub(crate) struct ExQuery<'a> { key_expr: String, parameters: String, value: ErlOption>, reference: ResourceArc, } -impl Query<'_> { - pub(crate) fn from(env: Env, query: zenoh::queryable::Query) -> Query { - Query { +impl ExQuery<'_> { + pub(crate) fn from(env: Env, query: zenoh::queryable::Query) -> ExQuery { + ExQuery { key_expr: query.key_expr().to_string(), parameters: query.parameters().to_string(), value: match query.value() { - Some(value) => ErlOption::some(crate::value::Value::to_term(env, value)), + Some(value) => ErlOption::some(crate::value::ExValue::from(env, value)), None => ErlOption::none(), }, reference: ResourceArc::new(QueryRef(RwLock::new(Some(query)))), @@ -29,7 +29,11 @@ impl Query<'_> { } #[rustler::nif(schedule = "DirtyIo")] -fn query_reply<'a>(env: Env<'a>, query: Query<'a>, sample: crate::sample::Sample<'a>) -> Term<'a> { +fn query_reply<'a>( + env: Env<'a>, + query: ExQuery<'a>, + sample: crate::sample::ExSample<'a>, +) -> Term<'a> { let lock: &RwLock> = &query.reference.0; let guard = match lock.read() { Ok(guard) => guard, @@ -57,7 +61,7 @@ fn query_reply<'a>(env: Env<'a>, query: Query<'a>, sample: crate::sample::Sample } #[rustler::nif(schedule = "DirtyIo")] -fn query_finish_reply<'a>(env: Env<'a>, query: Query<'a>) -> Term<'a> { +fn query_finish_reply<'a>(env: Env<'a>, query: ExQuery<'a>) -> Term<'a> { let lock: &RwLock> = &query.reference.0; let mut guard = match lock.write() { Ok(guard) => guard, @@ -82,43 +86,43 @@ fn query_finish_reply<'a>(env: Env<'a>, query: Query<'a>) -> Term<'a> { #[derive(rustler::NifStruct)] #[module = "Zenohex.Query.Options"] -pub(crate) struct QueryOptions { - pub(crate) target: QueryTarget, - pub(crate) consolidation: ConsolidationMode, +pub(crate) struct ExQueryOptions { + pub(crate) target: ExQueryTarget, + pub(crate) consolidation: ExConsolidationMode, } #[derive(rustler::NifUnitEnum)] -pub(crate) enum QueryTarget { +pub(crate) enum ExQueryTarget { BestMatching, All, AllComplete, } -impl From for zenoh::query::QueryTarget { - fn from(value: QueryTarget) -> Self { +impl From for zenoh::query::QueryTarget { + fn from(value: ExQueryTarget) -> Self { match value { - QueryTarget::BestMatching => zenoh::query::QueryTarget::BestMatching, - QueryTarget::All => zenoh::query::QueryTarget::All, - QueryTarget::AllComplete => zenoh::query::QueryTarget::AllComplete, + ExQueryTarget::BestMatching => zenoh::query::QueryTarget::BestMatching, + ExQueryTarget::All => zenoh::query::QueryTarget::All, + ExQueryTarget::AllComplete => zenoh::query::QueryTarget::AllComplete, } } } #[derive(rustler::NifUnitEnum)] -pub(crate) enum ConsolidationMode { +pub(crate) enum ExConsolidationMode { Auto, None, Monotonic, Latest, } -impl From for zenoh::query::QueryConsolidation { - fn from(value: ConsolidationMode) -> Self { +impl From for zenoh::query::QueryConsolidation { + fn from(value: ExConsolidationMode) -> Self { match value { - ConsolidationMode::Auto => zenoh::query::Mode::Auto.into(), - ConsolidationMode::None => zenoh::query::ConsolidationMode::None.into(), - ConsolidationMode::Monotonic => zenoh::query::ConsolidationMode::Monotonic.into(), - ConsolidationMode::Latest => zenoh::query::ConsolidationMode::Latest.into(), + ExConsolidationMode::Auto => zenoh::query::Mode::Auto.into(), + ExConsolidationMode::None => zenoh::query::ConsolidationMode::None.into(), + ExConsolidationMode::Monotonic => zenoh::query::ConsolidationMode::Monotonic.into(), + ExConsolidationMode::Latest => zenoh::query::ConsolidationMode::Latest.into(), } } } diff --git a/native/zenohex_nif/src/queryable.rs b/native/zenohex_nif/src/queryable.rs index c3d50d1..abe9919 100644 --- a/native/zenohex_nif/src/queryable.rs +++ b/native/zenohex_nif/src/queryable.rs @@ -14,13 +14,13 @@ fn queryable_recv_timeout( ) -> Result { let queryable: &Queryable<'_, Receiver> = &resource.0; match queryable.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(query) => Ok(crate::query::Query::from(env, query).encode(env)), + Ok(query) => Ok(crate::query::ExQuery::from(env, query).encode(env)), Err(_recv_timeout_error) => Err(atoms::timeout().encode(env)), } } #[derive(rustler::NifStruct)] #[module = "Zenohex.Queryable.Options"] -pub(crate) struct QueryableOptions { +pub(crate) struct ExQueryableOptions { pub(crate) complete: bool, } diff --git a/native/zenohex_nif/src/sample.rs b/native/zenohex_nif/src/sample.rs index 8f535b7..5111676 100644 --- a/native/zenohex_nif/src/sample.rs +++ b/native/zenohex_nif/src/sample.rs @@ -4,18 +4,18 @@ use crate::SampleRef; #[derive(rustler::NifStruct)] #[module = "Zenohex.Sample"] -pub(crate) struct Sample<'a> { +pub(crate) struct ExSample<'a> { pub(crate) key_expr: String, pub(crate) value: Term<'a>, - pub(crate) kind: SampleKind, + pub(crate) kind: ExSampleKind, pub(crate) reference: ErlOption>, } -impl Sample<'_> { - pub(crate) fn from(env: Env, sample: zenoh::sample::Sample) -> Sample { - Sample { +impl ExSample<'_> { + pub(crate) fn from(env: Env, sample: zenoh::sample::Sample) -> ExSample { + ExSample { key_expr: sample.key_expr.to_string(), - value: crate::value::Value::to_term(env, &sample.value), + value: crate::value::ExValue::from(env, &sample.value), kind: sample.kind.into(), reference: ErlOption::some(ResourceArc::new(SampleRef(sample))), } @@ -23,16 +23,16 @@ impl Sample<'_> { } #[derive(rustler::NifUnitEnum)] -pub(crate) enum SampleKind { +pub(crate) enum ExSampleKind { Put, Delete, } -impl From for SampleKind { +impl From for ExSampleKind { fn from(kind: zenoh::prelude::SampleKind) -> Self { match kind { - zenoh::prelude::SampleKind::Put => SampleKind::Put, - zenoh::prelude::SampleKind::Delete => SampleKind::Delete, + zenoh::prelude::SampleKind::Put => ExSampleKind::Put, + zenoh::prelude::SampleKind::Delete => ExSampleKind::Delete, } } } diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index 8d5946b..31c88d2 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -8,7 +8,7 @@ use zenoh::{prelude::sync::*, query::Reply, value::Value, Session}; fn declare_publisher( resource: ResourceArc, key_expr: String, - opts: crate::publisher::PublisherOptions, + opts: crate::publisher::ExPublisherOptions, ) -> Result, String> { let session: &Arc = &resource.0; match session @@ -61,7 +61,7 @@ fn declare_pull_subscriber( fn declare_queryable( resource: ResourceArc, key_expr: String, - opts: crate::queryable::QueryableOptions, + opts: crate::queryable::ExQueryableOptions, ) -> Result, String> { let session: &Arc = &resource.0; match session @@ -121,7 +121,7 @@ fn session_put_impl>( fn session_get_reply_receiver( resource: ResourceArc, selector: String, - opts: crate::query::QueryOptions, + opts: crate::query::ExQueryOptions, ) -> Result, String> { let session: &Arc = &resource.0; // TODO: with_value の実装は用途が出てきたら検討 @@ -145,8 +145,8 @@ fn session_get_reply_timeout( let receiver: &Receiver = &resource.0; match receiver.recv_timeout(Duration::from_micros(timeout_us)) { Ok(reply) => match reply.sample { - Ok(sample) => Ok(crate::sample::Sample::from(env, sample).encode(env)), - Err(value) => Err(crate::value::Value::to_term(env, &value)), + Ok(sample) => Ok(crate::sample::ExSample::from(env, sample).encode(env)), + Err(value) => Err(crate::value::ExValue::from(env, &value).encode(env)), }, Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } diff --git a/native/zenohex_nif/src/subscriber.rs b/native/zenohex_nif/src/subscriber.rs index 8f97dbe..ca7c91a 100644 --- a/native/zenohex_nif/src/subscriber.rs +++ b/native/zenohex_nif/src/subscriber.rs @@ -12,7 +12,7 @@ fn subscriber_recv_timeout( ) -> Result { let subscriber: &Subscriber<'_, Receiver> = &resource.0; match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { - Ok(sample) => Ok(crate::sample::Sample::from(env, sample).encode(env)), + Ok(sample) => Ok(crate::sample::ExSample::from(env, sample).encode(env)), Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), } } @@ -20,20 +20,20 @@ fn subscriber_recv_timeout( #[derive(rustler::NifStruct)] #[module = "Zenohex.Subscriber.Options"] pub(crate) struct SubscriberOptions { - pub(crate) reliability: Reliability, + pub(crate) reliability: ExReliability, } #[derive(rustler::NifUnitEnum)] -pub(crate) enum Reliability { +pub(crate) enum ExReliability { BestEffort, Reliable, } -impl From for zenoh::subscriber::Reliability { - fn from(value: Reliability) -> Self { +impl From for zenoh::subscriber::Reliability { + fn from(value: ExReliability) -> Self { match value { - Reliability::BestEffort => zenoh::subscriber::Reliability::BestEffort, - Reliability::Reliable => zenoh::subscriber::Reliability::Reliable, + ExReliability::BestEffort => zenoh::subscriber::Reliability::BestEffort, + ExReliability::Reliable => zenoh::subscriber::Reliability::Reliable, } } } diff --git a/native/zenohex_nif/src/value.rs b/native/zenohex_nif/src/value.rs index 3012fc1..bee2749 100644 --- a/native/zenohex_nif/src/value.rs +++ b/native/zenohex_nif/src/value.rs @@ -3,10 +3,10 @@ use std::{borrow::Cow, io::Write}; use rustler::{Encoder, Env, OwnedBinary, Term}; use zenoh::prelude::KnownEncoding; -pub(crate) struct Value; +pub(crate) struct ExValue; -impl Value { - pub(crate) fn to_term<'a>(env: Env<'a>, value: &zenoh::value::Value) -> Term<'a> { +impl ExValue { + pub(crate) fn from<'a>(env: Env<'a>, value: &zenoh::value::Value) -> Term<'a> { match value.encoding.prefix() { KnownEncoding::Empty => unimplemented!(), KnownEncoding::AppOctetStream => match Cow::try_from(value) { From 71d24b01692a6fd824b806a0c93311c842b0f2ac Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 6 Feb 2024 14:00:48 +0900 Subject: [PATCH 069/165] Add From trait impl to sample.rs --- lib/zenohex/sample.ex | 2 +- native/zenohex_nif/src/query.rs | 4 ++-- native/zenohex_nif/src/sample.rs | 30 +++++++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/zenohex/sample.ex b/lib/zenohex/sample.ex index 059dd07..8ce0cef 100644 --- a/lib/zenohex/sample.ex +++ b/lib/zenohex/sample.ex @@ -9,5 +9,5 @@ defmodule Zenohex.Sample do kind: :put | :delete, reference: reference() | :undefined } - defstruct [:key_expr, :value, :kind, :reference] + defstruct key_expr: "", value: "", kind: :put, reference: :undefined end diff --git a/native/zenohex_nif/src/query.rs b/native/zenohex_nif/src/query.rs index 4223953..88acecb 100644 --- a/native/zenohex_nif/src/query.rs +++ b/native/zenohex_nif/src/query.rs @@ -50,9 +50,9 @@ fn query_reply<'a>( } }; let sample: zenoh::sample::Sample = - match Option::>::from(sample.reference) { + match Option::>::from(sample.reference.clone()) { Some(resource) => resource.0.clone(), - None => todo!(), // TODO: Zenoh 外のデータから Sample を作る場合に実装する + None => sample.into(), }; match query.reply(Ok(sample)).res_sync() { Ok(_) => atom::ok().encode(env), diff --git a/native/zenohex_nif/src/sample.rs b/native/zenohex_nif/src/sample.rs index 5111676..3673f13 100644 --- a/native/zenohex_nif/src/sample.rs +++ b/native/zenohex_nif/src/sample.rs @@ -1,4 +1,4 @@ -use rustler::{Env, ErlOption, ResourceArc, Term}; +use rustler::{Binary, Env, ErlOption, ResourceArc, Term}; use crate::SampleRef; @@ -22,6 +22,34 @@ impl ExSample<'_> { } } +impl From> for zenoh::sample::Sample { + fn from(sample: ExSample) -> Self { + let key_expr = unsafe { zenoh::key_expr::KeyExpr::from_string_unchecked(sample.key_expr) }; + let value = match sample.value.get_type() { + rustler::TermType::Atom => unimplemented!(), + rustler::TermType::Binary => { + let binary = sample.value.decode::().unwrap(); + zenoh::value::Value::from(binary.as_slice()) + } + rustler::TermType::Fun => unimplemented!(), + rustler::TermType::List => unimplemented!(), + rustler::TermType::Map => unimplemented!(), + rustler::TermType::Integer => { + zenoh::value::Value::from(sample.value.decode::().unwrap()) + } + rustler::TermType::Float => { + zenoh::value::Value::from(sample.value.decode::().unwrap()) + } + rustler::TermType::Pid => unimplemented!(), + rustler::TermType::Port => unimplemented!(), + rustler::TermType::Ref => unimplemented!(), + rustler::TermType::Tuple => unimplemented!(), + rustler::TermType::Unknown => unimplemented!(), + }; + zenoh::sample::Sample::new(key_expr, value) + } +} + #[derive(rustler::NifUnitEnum)] pub(crate) enum ExSampleKind { Put, From 9a3c817365cf5c5a73b7f0adff1e41c6f405aabb Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 6 Feb 2024 15:35:31 +0900 Subject: [PATCH 070/165] Add key_expr_intersects/2 to NIFs --- lib/zenohex/examples/storage/queryable.ex | 7 +++++-- lib/zenohex/examples/storage/store.ex | 22 +++++++++++++++++++--- lib/zenohex/keyexpr.ex | 8 ++++++++ lib/zenohex/nif.ex | 4 ++++ native/zenohex_nif/src/keyexpr.rs | 8 ++++++++ native/zenohex_nif/src/lib.rs | 2 ++ test/zenohex/nif_test.exs | 7 +++++++ 7 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 lib/zenohex/keyexpr.ex create mode 100644 native/zenohex_nif/src/keyexpr.rs diff --git a/lib/zenohex/examples/storage/queryable.ex b/lib/zenohex/examples/storage/queryable.ex index 067c322..80d73a5 100644 --- a/lib/zenohex/examples/storage/queryable.ex +++ b/lib/zenohex/examples/storage/queryable.ex @@ -25,8 +25,11 @@ defmodule Zenohex.Examples.Storage.Queryable do {:error, :not_found} -> nil - {:ok, [sample]} -> - :ok = Query.reply(query, sample) + {:ok, samples} -> + Enum.each(samples, fn sample -> + :ok = Query.reply(query, sample) + end) + :ok = Query.finish_reply(query) # following line is not needed, this is just example of double call {:error, "ResponseFinal has already been sent"} = Query.finish_reply(query) diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index 79d3111..c463827 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -5,6 +5,8 @@ defmodule Zenohex.Examples.Storage.Store do require Logger + alias Zenohex.KeyExpr + def start_link(initial_state) do Agent.start_link(fn -> initial_state end, name: __MODULE__) end @@ -28,9 +30,12 @@ defmodule Zenohex.Examples.Storage.Store do Agent.get( __MODULE__, fn map -> - case Map.get(map, key_expr) do - nil -> {:error, :not_found} - sample -> {:ok, [sample]} + samples = collect_samples(map, key_expr) + + if samples == [] do + {:error, :not_found} + else + {:ok, samples} end end ) @@ -39,4 +44,15 @@ defmodule Zenohex.Examples.Storage.Store do def dump() do Agent.get(__MODULE__, fn map -> map end) end + + defp collect_samples(map, key_expr) do + Map.keys(map) + |> Enum.filter(&KeyExpr.intersects?(key_expr, &1)) + |> Enum.reduce([], fn key, acc -> + case Map.get(map, key) do + nil -> acc + sample -> [sample | acc] + end + end) + end end diff --git a/lib/zenohex/keyexpr.ex b/lib/zenohex/keyexpr.ex new file mode 100644 index 0000000..8b8c73e --- /dev/null +++ b/lib/zenohex/keyexpr.ex @@ -0,0 +1,8 @@ +defmodule Zenohex.KeyExpr do + alias Zenohex.Nif + + @spec intersects?(String.t(), String.t()) :: boolean() + def intersects?(l, r) when is_binary(l) and is_binary(r) do + Nif.key_expr_intersects(l, r) + end +end diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index be26ca8..f809a51 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -105,4 +105,8 @@ defmodule Zenohex.Nif do def query_finish_reply(_query) do :erlang.nif_error(:nif_not_loaded) end + + def key_expr_intersects(_l, _r) do + :erlang.nif_error(:nif_not_loaded) + end end diff --git a/native/zenohex_nif/src/keyexpr.rs b/native/zenohex_nif/src/keyexpr.rs new file mode 100644 index 0000000..5065423 --- /dev/null +++ b/native/zenohex_nif/src/keyexpr.rs @@ -0,0 +1,8 @@ +use zenoh::key_expr::{keyexpr, KeyExpr}; + +#[rustler::nif] +fn key_expr_intersects(l: String, r: String) -> bool { + let lke = unsafe { KeyExpr::from_string_unchecked(l) }; + let rke = unsafe { KeyExpr::from_string_unchecked(r) }; + keyexpr::intersects(&lke, &rke) +} diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index faecfeb..c5b11a1 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -12,6 +12,7 @@ mod atoms { timeout, } } +mod keyexpr; mod publisher; mod pull_subscriber; mod query; @@ -92,6 +93,7 @@ rustler::init!( queryable::queryable_recv_timeout, query::query_reply, query::query_finish_reply, + keyexpr::key_expr_intersects, ], load = load ); diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 35e8a15..38dc72b 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -170,4 +170,11 @@ defmodule Zenohex.NifTest do assert is_reference(queryable) end end + + describe "key_expr" do + test "key_expr_intersects/2" do + assert Nif.key_expr_intersects("key/expression/**", "key/expression/demo") + refute Nif.key_expr_intersects("key/expression/**", "key/value") + end + end end From 132c5cf389cb2b761f2794d35659dc4cc6e29947 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 07:57:45 +0900 Subject: [PATCH 071/165] Add test to check Nif.key_expr_intersects/2's left and right are equal --- lib/zenohex/examples/storage/store.ex | 2 +- test/zenohex/nif_test.exs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index c463827..81f1d7c 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -47,7 +47,7 @@ defmodule Zenohex.Examples.Storage.Store do defp collect_samples(map, key_expr) do Map.keys(map) - |> Enum.filter(&KeyExpr.intersects?(key_expr, &1)) + |> Enum.filter(&KeyExpr.intersects?(&1, key_expr)) |> Enum.reduce([], fn key, acc -> case Map.get(map, key) do nil -> acc diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 38dc72b..672a9fa 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -174,7 +174,9 @@ defmodule Zenohex.NifTest do describe "key_expr" do test "key_expr_intersects/2" do assert Nif.key_expr_intersects("key/expression/**", "key/expression/demo") + assert Nif.key_expr_intersects("key/expression/demo", "key/expression/**") refute Nif.key_expr_intersects("key/expression/**", "key/value") + refute Nif.key_expr_intersects("key/value", "key/expression/**") end end end From 6783023840f9305d5c74a7cc24ceae2e02dffea9 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 09:37:21 +0900 Subject: [PATCH 072/165] Add {:error, :disconnected} return to *_timeout NIFs --- lib/zenohex/pull_subscriber.ex | 5 ++++- lib/zenohex/queryable.ex | 5 ++++- lib/zenohex/session.ex | 14 ++++++++++---- lib/zenohex/subscriber.ex | 5 ++++- native/zenohex_nif/src/lib.rs | 1 + native/zenohex_nif/src/pull_subscriber.rs | 5 +++-- native/zenohex_nif/src/queryable.rs | 5 +++-- native/zenohex_nif/src/session.rs | 5 +++-- native/zenohex_nif/src/subscriber.rs | 5 +++-- test/zenohex/nif_test.exs | 2 +- 10 files changed, 36 insertions(+), 16 deletions(-) diff --git a/lib/zenohex/pull_subscriber.ex b/lib/zenohex/pull_subscriber.ex index 9c2c176..d3d013e 100644 --- a/lib/zenohex/pull_subscriber.ex +++ b/lib/zenohex/pull_subscriber.ex @@ -34,7 +34,10 @@ defmodule Zenohex.PullSubscriber do {:error, :timeout} """ @spec recv_timeout(t(), pos_integer()) :: - {:ok, Sample.t()} | {:error, :timeout} | {:error, reason :: String.t()} + {:ok, Sample.t()} + | {:error, :timeout} + | {:error, :disconnected} + | {:error, reason :: String.t()} def recv_timeout(pull_subscriber, timeout_us) when is_reference(pull_subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.pull_subscriber_recv_timeout(pull_subscriber, timeout_us) diff --git a/lib/zenohex/queryable.ex b/lib/zenohex/queryable.ex index 4117b1d..fecfe33 100644 --- a/lib/zenohex/queryable.ex +++ b/lib/zenohex/queryable.ex @@ -29,7 +29,10 @@ defmodule Zenohex.Queryable do {:error, :timeout} """ @spec recv_timeout(t(), pos_integer()) :: - {:ok, Query.t()} | {:error, :timeout} | {:error, reason :: String.t()} + {:ok, Query.t()} + | {:error, :timeout} + | {:error, :disconnected} + | {:error, reason :: String.t()} def recv_timeout(queryable, timeout_us) when is_reference(queryable) and is_integer(timeout_us) and timeout_us > 0 do Nif.queryable_recv_timeout(queryable, timeout_us) diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex index 7574309..2c36ea1 100644 --- a/lib/zenohex/session.ex +++ b/lib/zenohex/session.ex @@ -108,10 +108,13 @@ defmodule Zenohex.Session do iex> {:ok, session} = Zenohex.open() iex> Zenohex.Session.get_timeout(session, "key/**", 1000) - {:error, :timeout} + {:error, :disconnected} """ @spec get_timeout(t(), String.t(), pos_integer(), Query.Options.t()) :: - {:ok, Sample.t()} | {:error, :timeout} | {:error, reason :: any()} + {:ok, Sample.t()} + | {:error, :timeout} + | {:error, :disconnected} + | {:error, reason :: any()} def get_timeout(session, selector, timeout_us, opts \\ %Query.Options{}) do case get_reply_receiver(session, selector, opts) do {:ok, receiver} -> get_reply_timeout(receiver, timeout_us) @@ -142,10 +145,13 @@ defmodule Zenohex.Session do iex> {:ok, session} = Zenohex.open() iex> {:ok, receiver} = Zenohex.Session.get_reply_receiver(session, "key/**") iex> Zenohex.Session.get_reply_timeout(receiver, 1000) - {:error, :timeout} + {:error, :disconnected} """ @spec get_reply_timeout(receiver(), pos_integer()) :: - {:ok, Sample.t()} | {:error, :timeout} | {:error, reason :: any()} + {:ok, Sample.t()} + | {:error, :timeout} + | {:error, :disconnected} + | {:error, reason :: any()} def get_reply_timeout(receiver, timeout_us) when is_reference(receiver) and is_integer(timeout_us) and timeout_us > 0 do Nif.session_get_reply_timeout(receiver, timeout_us) diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex index 707db26..574d735 100644 --- a/lib/zenohex/subscriber.ex +++ b/lib/zenohex/subscriber.ex @@ -29,7 +29,10 @@ defmodule Zenohex.Subscriber do {:error, :timeout} """ @spec recv_timeout(t(), pos_integer()) :: - {:ok, Sample.t()} | {:error, :timeout} | {:error, reason :: String.t()} + {:ok, Sample.t()} + | {:error, :timeout} + | {:error, :disconnected} + | {:error, reason :: String.t()} def recv_timeout(subscriber, timeout_us) when is_reference(subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.subscriber_recv_timeout(subscriber, timeout_us) diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index c5b11a1..cbcf8ab 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -10,6 +10,7 @@ use zenoh::{ mod atoms { rustler::atoms! { timeout, + disconnected, } } mod keyexpr; diff --git a/native/zenohex_nif/src/pull_subscriber.rs b/native/zenohex_nif/src/pull_subscriber.rs index 6002c6d..f832286 100644 --- a/native/zenohex_nif/src/pull_subscriber.rs +++ b/native/zenohex_nif/src/pull_subscriber.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use flume::Receiver; +use flume::{Receiver, RecvTimeoutError}; use rustler::{types::atom, Encoder, Env, ResourceArc, Term}; use zenoh::{prelude::sync::SyncResolve, sample::Sample, subscriber::PullSubscriber}; @@ -13,7 +13,8 @@ fn pull_subscriber_recv_timeout( let pull_subscriber: &PullSubscriber<'_, Receiver> = &resource.0; match pull_subscriber.recv_timeout(Duration::from_micros(timeout_us)) { Ok(sample) => Ok(crate::sample::ExSample::from(env, sample).encode(env)), - Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), + Err(RecvTimeoutError::Timeout) => Err(crate::atoms::timeout().encode(env)), + Err(RecvTimeoutError::Disconnected) => Err(crate::atoms::disconnected().encode(env)), } } diff --git a/native/zenohex_nif/src/queryable.rs b/native/zenohex_nif/src/queryable.rs index abe9919..d1a7f13 100644 --- a/native/zenohex_nif/src/queryable.rs +++ b/native/zenohex_nif/src/queryable.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use flume::Receiver; +use flume::{Receiver, RecvTimeoutError}; use rustler::{Encoder, Env, ResourceArc, Term}; use zenoh::queryable::{Query, Queryable}; @@ -15,7 +15,8 @@ fn queryable_recv_timeout( let queryable: &Queryable<'_, Receiver> = &resource.0; match queryable.recv_timeout(Duration::from_micros(timeout_us)) { Ok(query) => Ok(crate::query::ExQuery::from(env, query).encode(env)), - Err(_recv_timeout_error) => Err(atoms::timeout().encode(env)), + Err(RecvTimeoutError::Timeout) => Err(atoms::timeout().encode(env)), + Err(RecvTimeoutError::Disconnected) => Err(atoms::disconnected().encode(env)), } } diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index 31c88d2..0111941 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -1,6 +1,6 @@ use std::{sync::Arc, time::Duration}; -use flume::Receiver; +use flume::{Receiver, RecvTimeoutError}; use rustler::{types::atom, Binary, Encoder, Env, ResourceArc, Term}; use zenoh::{prelude::sync::*, query::Reply, value::Value, Session}; @@ -148,7 +148,8 @@ fn session_get_reply_timeout( Ok(sample) => Ok(crate::sample::ExSample::from(env, sample).encode(env)), Err(value) => Err(crate::value::ExValue::from(env, &value).encode(env)), }, - Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), + Err(RecvTimeoutError::Timeout) => Err(crate::atoms::timeout().encode(env)), + Err(RecvTimeoutError::Disconnected) => Err(crate::atoms::disconnected().encode(env)), } } diff --git a/native/zenohex_nif/src/subscriber.rs b/native/zenohex_nif/src/subscriber.rs index ca7c91a..d83ee69 100644 --- a/native/zenohex_nif/src/subscriber.rs +++ b/native/zenohex_nif/src/subscriber.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use flume::Receiver; +use flume::{Receiver, RecvTimeoutError}; use rustler::{Encoder, Env, ResourceArc, Term}; use zenoh::{sample::Sample, subscriber::Subscriber}; @@ -13,7 +13,8 @@ fn subscriber_recv_timeout( let subscriber: &Subscriber<'_, Receiver> = &resource.0; match subscriber.recv_timeout(Duration::from_micros(timeout_us)) { Ok(sample) => Ok(crate::sample::ExSample::from(env, sample).encode(env)), - Err(_recv_timeout_error) => Err(crate::atoms::timeout().encode(env)), + Err(RecvTimeoutError::Timeout) => Err(crate::atoms::timeout().encode(env)), + Err(RecvTimeoutError::Disconnected) => Err(crate::atoms::disconnected().encode(env)), } } diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 672a9fa..f97899a 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -29,7 +29,7 @@ defmodule Zenohex.NifTest do test "session_get_reply_timeout/2", %{session: session} do {:ok, receiver} = Nif.session_get_reply_receiver(session, "key_expression") - assert Nif.session_get_reply_timeout(receiver, 1000) == {:error, :timeout} + assert Nif.session_get_reply_timeout(receiver, 1000) == {:error, :disconnected} end test "session_delete/2", %{session: session} do From e200a2183ed34da92ce6a1e25483a740c701bd14 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 12:16:12 +0900 Subject: [PATCH 073/165] Add queryable_server to examples --- lib/zenohex/examples/queryable_server.ex | 42 +++++++++++++++++++ .../examples/queryable_server_test.exs | 25 +++++++++++ 2 files changed, 67 insertions(+) create mode 100644 lib/zenohex/examples/queryable_server.ex create mode 100644 test/zenohex/examples/queryable_server_test.exs diff --git a/lib/zenohex/examples/queryable_server.ex b/lib/zenohex/examples/queryable_server.ex new file mode 100644 index 0000000..42adea6 --- /dev/null +++ b/lib/zenohex/examples/queryable_server.ex @@ -0,0 +1,42 @@ +defmodule Zenohex.Examples.QueryableServer do + use GenServer + + require Logger + + alias Zenohex.Session + alias Zenohex.Queryable + + def start_link(args) do + GenServer.start_link(__MODULE__, args, name: __MODULE__) + end + + def init(args) do + session = Map.fetch!(args, :session) + key_expr = Map.fetch!(args, :key_expr) + callback = Map.fetch!(args, :callback) + {:ok, queryable} = Session.declare_queryable(session, key_expr) + + send(self(), :loop) + + {:ok, %{queryable: queryable, callback: callback}} + end + + def handle_info(:loop, state) do + case Queryable.recv_timeout(state.queryable, 1000) do + {:ok, query} -> + state.callback.(query) + send(self(), :loop) + + {:error, :timeout} -> + send(self(), :loop) + + {:error, :disconnected} -> + raise("unreachable!") + + {:error, error} -> + Logger.error(inspect(error)) + end + + {:noreply, state} + end +end diff --git a/test/zenohex/examples/queryable_server_test.exs b/test/zenohex/examples/queryable_server_test.exs new file mode 100644 index 0000000..be368d7 --- /dev/null +++ b/test/zenohex/examples/queryable_server_test.exs @@ -0,0 +1,25 @@ +defmodule Zenohex.Examples.QueryableServerTest do + use ExUnit.Case + + require Logger + + alias Zenohex.Examples.QueryableServer + alias Zenohex.Session + alias Zenohex.Query + + test "start_link/1" do + {:ok, session} = Zenohex.open() + key_expr = "key/expression/**" + + me = self() + callback = fn query -> send(me, query) end + + start_supervised!( + {QueryableServer, %{session: session, key_expr: key_expr, callback: callback}} + ) + + Session.get_timeout(session, key_expr, 1000) + + assert_receive(%Query{}) + end +end From db408620d71a7afd10e9a382f311d1e0f15d1f39 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 12:16:22 +0900 Subject: [PATCH 074/165] Add session_server to examples --- lib/zenohex/examples/session_server.ex | 78 +++++++++++++++++++ test/zenohex/examples/session_server_test.exs | 49 ++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 lib/zenohex/examples/session_server.ex create mode 100644 test/zenohex/examples/session_server_test.exs diff --git a/lib/zenohex/examples/session_server.ex b/lib/zenohex/examples/session_server.ex new file mode 100644 index 0000000..6c1e563 --- /dev/null +++ b/lib/zenohex/examples/session_server.ex @@ -0,0 +1,78 @@ +defmodule Zenohex.Examples.SessionServer do + use GenServer + + require Logger + + alias Zenohex.Session + + def start_link(args) do + GenServer.start_link(__MODULE__, args, name: __MODULE__) + end + + def session() do + GenServer.call(__MODULE__, :session) + end + + def put(key_expr, value) do + GenServer.call(__MODULE__, {:put, key_expr, value}) + end + + def set_disconnected_cb(callback) do + GenServer.call(__MODULE__, {:set_disconnected_cb, callback}) + end + + def get(selector, callback) do + GenServer.call(__MODULE__, {:get, selector, callback}) + end + + def init(_args) do + {:ok, session} = Zenohex.open() + + {:ok, + %{ + session: session, + selector: nil, + receiver: nil, + callback: nil, + disconnected_cb: fn -> nil end + }} + end + + def handle_call(:session, _from, state) do + {:reply, state.session, state} + end + + def handle_call({:put, key_expr, value}, _from, state) do + ret = Session.put(state.session, key_expr, value) + {:reply, ret, state} + end + + def handle_call({:set_disconnected_cb, callback}, _from, state) do + {:reply, :ok, %{state | disconnected_cb: callback}} + end + + def handle_call({:get, selector, callback}, _from, state) do + {:ok, receiver} = Session.get_reply_receiver(state.session, selector) + send(self(), :get_reply) + {:reply, :ok, %{state | selector: selector, receiver: receiver, callback: callback}} + end + + def handle_info(:get_reply, state) do + case Session.get_reply_timeout(state.receiver, 1000) do + {:ok, sample} -> + state.callback.(sample) + send(self(), :get_reply) + + {:error, :timeout} -> + send(self(), :get_reply) + + {:error, :disconnected} -> + state.disconnected_cb.() + + {:error, error} -> + Logger.error(inspect(error)) + end + + {:noreply, state} + end +end diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_server_test.exs new file mode 100644 index 0000000..ba72bb7 --- /dev/null +++ b/test/zenohex/examples/session_server_test.exs @@ -0,0 +1,49 @@ +defmodule Zenohex.Examples.SessionServerTest do + use ExUnit.Case + + alias Zenohex.Examples.SessionServer + alias Zenohex.Examples.QueryableServer + alias Zenohex.Query + alias Zenohex.Sample + + setup do + start_supervised!({SessionServer, nil}) + :ok + end + + test "session/2" do + assert is_reference(SessionServer.session()) + end + + test "put/2" do + assert SessionServer.put("key/expression", "value") == :ok + end + + describe "get/2" do + test "without queryable" do + me = self() + callback = fn sample -> send(me, sample) end + :ok = SessionServer.set_disconnected_cb(fn -> send(me, :disconnected) end) + + assert SessionServer.get("key/expression/**", callback) == :ok + assert_receive :disconnected + end + + test "with queryable" do + start_supervised!( + {QueryableServer, + %{ + session: SessionServer.session(), + key_expr: "key/expression/**", + callback: fn query -> Query.reply(query, %Sample{key_expr: "key/expression/reply"}) end + }} + ) + + me = self() + callback = fn sample -> send(me, sample) end + + assert SessionServer.get("key/expression/**", callback) == :ok + assert_receive %Sample{} + end + end +end From 18af264fcd834f2c1d2283128dea3211e70722c4 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 15:08:28 +0900 Subject: [PATCH 075/165] Add publisher_server to examples --- lib/zenohex/examples/publisher_server.ex | 53 +++++++++++++++++++ .../examples/publisher_server_test.exs | 30 +++++++++++ 2 files changed, 83 insertions(+) create mode 100644 lib/zenohex/examples/publisher_server.ex create mode 100644 test/zenohex/examples/publisher_server_test.exs diff --git a/lib/zenohex/examples/publisher_server.ex b/lib/zenohex/examples/publisher_server.ex new file mode 100644 index 0000000..6633521 --- /dev/null +++ b/lib/zenohex/examples/publisher_server.ex @@ -0,0 +1,53 @@ +defmodule Zenohex.Examples.PublisherServer do + use GenServer + + alias Zenohex.Session + alias Zenohex.Publisher + + def start_link(args) do + GenServer.start_link(__MODULE__, args, name: __MODULE__) + end + + def put(value) do + GenServer.call(__MODULE__, {:put, value}) + end + + def delete() do + GenServer.call(__MODULE__, :delete) + end + + def congestion_control(value) do + GenServer.call(__MODULE__, {:congestion_control, value}) + end + + def priority(value) do + GenServer.call(__MODULE__, {:priority, value}) + end + + def init(args) do + session = Map.fetch!(args, :session) + key_expr = Map.fetch!(args, :key_expr) + {:ok, publisher} = Session.declare_publisher(session, key_expr) + {:ok, %{publisher: publisher}} + end + + def handle_call({:put, value}, _from, state) do + :ok = Publisher.put(state.publisher, value) + {:reply, :ok, state} + end + + def handle_call(:delete, _from, state) do + :ok = Publisher.delete(state.publisher) + {:reply, :ok, state} + end + + def handle_call({:congestion_control, value}, _from, state) do + publisher = Publisher.congestion_control(state.publisher, value) + {:reply, :ok, %{state | publisher: publisher}} + end + + def handle_call({:priority, value}, _from, state) do + publisher = Publisher.priority(state.publisher, value) + {:reply, :ok, %{state | publisher: publisher}} + end +end diff --git a/test/zenohex/examples/publisher_server_test.exs b/test/zenohex/examples/publisher_server_test.exs new file mode 100644 index 0000000..1f3b82c --- /dev/null +++ b/test/zenohex/examples/publisher_server_test.exs @@ -0,0 +1,30 @@ +defmodule Zenohex.Examples.PublisherTest do + use ExUnit.Case + + alias Zenohex.Examples.PublisherServer + + setup do + {:ok, session} = Zenohex.open() + key_expr = "key/expression/pub" + start_supervised!({PublisherServer, %{session: session, key_expr: key_expr}}) + :ok + end + + test "put/1" do + assert PublisherServer.put("put") == :ok + end + + test "delete/0" do + assert PublisherServer.delete() == :ok + end + + test "congestion_control/1" do + assert PublisherServer.congestion_control(:block) == :ok + assert PublisherServer.put("put") == :ok + end + + test "priority/1" do + assert PublisherServer.priority(:real_time) == :ok + assert PublisherServer.put("put") == :ok + end +end From cce46712f36b72ed92906e9dd4cda4c29a765d8e Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 15:08:37 +0900 Subject: [PATCH 076/165] Add subscriber_server to examples --- lib/zenohex/examples/subscriber_server.ex | 42 +++++++++++++++++++ .../examples/subscriber_server_test.exs | 23 ++++++++++ 2 files changed, 65 insertions(+) create mode 100644 lib/zenohex/examples/subscriber_server.ex create mode 100644 test/zenohex/examples/subscriber_server_test.exs diff --git a/lib/zenohex/examples/subscriber_server.ex b/lib/zenohex/examples/subscriber_server.ex new file mode 100644 index 0000000..74c54b8 --- /dev/null +++ b/lib/zenohex/examples/subscriber_server.ex @@ -0,0 +1,42 @@ +defmodule Zenohex.Examples.SubscriberServer do + use GenServer + + require Logger + + alias Zenohex.Session + alias Zenohex.Subscriber + + def start_link(args) do + GenServer.start_link(__MODULE__, args, name: __MODULE__) + end + + def init(args) do + session = Map.fetch!(args, :session) + key_expr = Map.fetch!(args, :key_expr) + callback = Map.fetch!(args, :callback) + + {:ok, subscriber} = Session.declare_subscriber(session, key_expr) + send(self(), :loop) + + {:ok, %{subscriber: subscriber, callback: callback}} + end + + def handle_info(:loop, state) do + case Subscriber.recv_timeout(state.subscriber, 1000) do + {:ok, sample} -> + state.callback.(sample) + send(self(), :loop) + + {:error, :timeout} -> + send(self(), :loop) + + {:error, :disconnected} -> + raise("unreachable!") + + {:error, error} -> + Logger.error(inspect(error)) + end + + {:noreply, state} + end +end diff --git a/test/zenohex/examples/subscriber_server_test.exs b/test/zenohex/examples/subscriber_server_test.exs new file mode 100644 index 0000000..7939712 --- /dev/null +++ b/test/zenohex/examples/subscriber_server_test.exs @@ -0,0 +1,23 @@ +defmodule Zenohex.Examples.SubscriberServerTest do + use ExUnit.Case + + alias Zenohex.Examples.SubscriberServer + alias Zenohex.Session + alias Zenohex.Sample + + test "start_link/1" do + {:ok, session} = Zenohex.open() + key_expr = "key/expression/**" + + me = self() + callback = fn sample -> send(me, sample) end + + start_supervised!( + {SubscriberServer, %{session: session, key_expr: key_expr, callback: callback}} + ) + + Session.put(session, "key/expression/put", "put") + + assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + end +end From 304e06ee71d865addbd2bf8f5707b5961376e1bc Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 15:08:44 +0900 Subject: [PATCH 077/165] Add pull_subscriber_server to examples --- .../examples/pull_subscriber_server.ex | 51 +++++++++++++++++++ .../examples/pull_subscriber_server_test.exs | 42 +++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 lib/zenohex/examples/pull_subscriber_server.ex create mode 100644 test/zenohex/examples/pull_subscriber_server_test.exs diff --git a/lib/zenohex/examples/pull_subscriber_server.ex b/lib/zenohex/examples/pull_subscriber_server.ex new file mode 100644 index 0000000..7a56aad --- /dev/null +++ b/lib/zenohex/examples/pull_subscriber_server.ex @@ -0,0 +1,51 @@ +defmodule Zenohex.Examples.PullSubscriberServer do + use GenServer + + require Logger + + alias Zenohex.Session + alias Zenohex.PullSubscriber + + def start_link(args) do + GenServer.start_link(__MODULE__, args, name: __MODULE__) + end + + def pull() do + GenServer.call(__MODULE__, :pull) + end + + def init(args) do + session = Map.fetch!(args, :session) + key_expr = Map.fetch!(args, :key_expr) + callback = Map.fetch!(args, :callback) + + {:ok, pull_subscriber} = Session.declare_pull_subscriber(session, key_expr) + send(self(), :loop) + + {:ok, %{pull_subscriber: pull_subscriber, callback: callback}} + end + + def handle_info(:loop, state) do + case PullSubscriber.recv_timeout(state.pull_subscriber, 1000) do + {:ok, sample} -> + state.callback.(sample) + send(self(), :loop) + + {:error, :timeout} -> + send(self(), :loop) + + {:error, :disconnected} -> + raise("unreachable!") + + {:error, error} -> + Logger.error(inspect(error)) + end + + {:noreply, state} + end + + def handle_call(:pull, _from, state) do + :ok = PullSubscriber.pull(state.pull_subscriber) + {:reply, :ok, state} + end +end diff --git a/test/zenohex/examples/pull_subscriber_server_test.exs b/test/zenohex/examples/pull_subscriber_server_test.exs new file mode 100644 index 0000000..a17c192 --- /dev/null +++ b/test/zenohex/examples/pull_subscriber_server_test.exs @@ -0,0 +1,42 @@ +defmodule Zenohex.Examples.PullSubscriberServerTest do + use ExUnit.Case + + alias Zenohex.Examples.PullSubscriberServer + alias Zenohex.Session + alias Zenohex.Sample + + test "start_link/1" do + {:ok, session} = Zenohex.open() + key_expr = "key/expression/**" + + me = self() + callback = fn sample -> send(me, sample) end + + start_supervised!( + {PullSubscriberServer, %{session: session, key_expr: key_expr, callback: callback}} + ) + + Session.put(session, "key/expression/put", "put") + + assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + end + + test "pull/0" do + {:ok, session} = Zenohex.open() + key_expr = "key/expression/**" + + me = self() + callback = fn sample -> send(me, sample) end + + start_supervised!( + {PullSubscriberServer, %{session: session, key_expr: key_expr, callback: callback}} + ) + + Session.put(session, "key/expression/put", "put") + + assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + refute_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + PullSubscriberServer.pull() + assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + end +end From 1337253304ceb0ebb77661ae5d1187230b187dcc Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 15:35:25 +0900 Subject: [PATCH 078/165] Add delete/1 to examples/session_server --- lib/zenohex/examples/session_server.ex | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/zenohex/examples/session_server.ex b/lib/zenohex/examples/session_server.ex index 6c1e563..6464f79 100644 --- a/lib/zenohex/examples/session_server.ex +++ b/lib/zenohex/examples/session_server.ex @@ -21,6 +21,10 @@ defmodule Zenohex.Examples.SessionServer do GenServer.call(__MODULE__, {:set_disconnected_cb, callback}) end + def delete(key_expr) do + GenServer.call(__MODULE__, {:delete, key_expr}) + end + def get(selector, callback) do GenServer.call(__MODULE__, {:get, selector, callback}) end @@ -51,6 +55,11 @@ defmodule Zenohex.Examples.SessionServer do {:reply, :ok, %{state | disconnected_cb: callback}} end + def handle_call({:delete, key_expr}, _from, state) do + :ok = Session.delete(state.session, key_expr) + {:reply, :ok, state} + end + def handle_call({:get, selector, callback}, _from, state) do {:ok, receiver} = Session.get_reply_receiver(state.session, selector) send(self(), :get_reply) From 88b5463a774abaf4a1beae14e3ad5c02df498c6e Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 15:35:46 +0900 Subject: [PATCH 079/165] Modify examples/session_server's test --- test/zenohex/examples/session_server_test.exs | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_server_test.exs index ba72bb7..2391b86 100644 --- a/test/zenohex/examples/session_server_test.exs +++ b/test/zenohex/examples/session_server_test.exs @@ -2,6 +2,7 @@ defmodule Zenohex.Examples.SessionServerTest do use ExUnit.Case alias Zenohex.Examples.SessionServer + alias Zenohex.Examples.SubscriberServer alias Zenohex.Examples.QueryableServer alias Zenohex.Query alias Zenohex.Sample @@ -15,8 +16,40 @@ defmodule Zenohex.Examples.SessionServerTest do assert is_reference(SessionServer.session()) end - test "put/2" do - assert SessionServer.put("key/expression", "value") == :ok + describe "put/2" do + test "with subscriber" do + me = self() + + start_supervised!( + {SubscriberServer, + %{ + session: SessionServer.session(), + key_expr: "key/expression/**", + callback: fn sample -> send(me, sample) end + }} + ) + + assert SessionServer.put("key/expression/put", "value") == :ok + assert_receive %Sample{key_expr: "key/expression/put", value: "value"} + end + end + + describe "delete/1" do + test "with subscriber" do + me = self() + + start_supervised!( + {SubscriberServer, + %{ + session: SessionServer.session(), + key_expr: "key/expression/**", + callback: fn sample -> send(me, sample) end + }} + ) + + assert SessionServer.delete("key/expression/delete") == :ok + assert_receive %Sample{key_expr: "key/expression/delete", kind: :delete} + end end describe "get/2" do From 2b0ac0782e8da0485e3cab1ae97f346eff61d173 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 15:35:54 +0900 Subject: [PATCH 080/165] Modify examples/publisher_server's test --- .../examples/publisher_server_test.exs | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/test/zenohex/examples/publisher_server_test.exs b/test/zenohex/examples/publisher_server_test.exs index 1f3b82c..0590646 100644 --- a/test/zenohex/examples/publisher_server_test.exs +++ b/test/zenohex/examples/publisher_server_test.exs @@ -2,20 +2,51 @@ defmodule Zenohex.Examples.PublisherTest do use ExUnit.Case alias Zenohex.Examples.PublisherServer + alias Zenohex.Examples.SubscriberServer + alias Zenohex.Sample setup do {:ok, session} = Zenohex.open() key_expr = "key/expression/pub" start_supervised!({PublisherServer, %{session: session, key_expr: key_expr}}) - :ok + + %{session: session} end - test "put/1" do - assert PublisherServer.put("put") == :ok + describe "put/1" do + test "with subscriber", %{session: session} do + me = self() + + start_supervised!( + {SubscriberServer, + %{ + session: session, + key_expr: "key/expression/**", + callback: fn sample -> send(me, sample) end + }} + ) + + assert PublisherServer.put("put") == :ok + assert_receive %Sample{key_expr: "key/expression/pub", kind: :put, value: "put"} + end end - test "delete/0" do - assert PublisherServer.delete() == :ok + describe "delete/0" do + test "with subscriber", %{session: session} do + me = self() + + start_supervised!( + {SubscriberServer, + %{ + session: session, + key_expr: "key/expression/**", + callback: fn sample -> send(me, sample) end + }} + ) + + assert PublisherServer.delete() == :ok + assert_receive %Sample{key_expr: "key/expression/pub", kind: :delete} + end end test "congestion_control/1" do From e92be88fc096061aec36b57a17a92ecd86eff580 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 15:44:49 +0900 Subject: [PATCH 081/165] Fix examples/session_server test --- test/zenohex/examples/session_server_test.exs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_server_test.exs index 2391b86..16f5d46 100644 --- a/test/zenohex/examples/session_server_test.exs +++ b/test/zenohex/examples/session_server_test.exs @@ -68,7 +68,10 @@ defmodule Zenohex.Examples.SessionServerTest do %{ session: SessionServer.session(), key_expr: "key/expression/**", - callback: fn query -> Query.reply(query, %Sample{key_expr: "key/expression/reply"}) end + callback: fn query -> + :ok = Query.reply(query, %Sample{key_expr: "key/expression/reply"}) + :ok = Query.finish_reply(query) + end }} ) From e314b962af55ed03168cb7ccc74854a1d058f497 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 7 Feb 2024 21:08:30 +0900 Subject: [PATCH 082/165] Enhance examples/publiser_server test --- test/zenohex/examples/publisher_server_test.exs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/zenohex/examples/publisher_server_test.exs b/test/zenohex/examples/publisher_server_test.exs index 0590646..52dc305 100644 --- a/test/zenohex/examples/publisher_server_test.exs +++ b/test/zenohex/examples/publisher_server_test.exs @@ -26,8 +26,10 @@ defmodule Zenohex.Examples.PublisherTest do }} ) - assert PublisherServer.put("put") == :ok - assert_receive %Sample{key_expr: "key/expression/pub", kind: :put, value: "put"} + for i <- 0..100 do + assert PublisherServer.put(i) == :ok + assert_receive %Sample{key_expr: "key/expression/pub", kind: :put, value: ^i} + end end end From 1ea2bc26e44c4b21e190fc9b0b8eb7f594a7b527 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 08:59:53 +0900 Subject: [PATCH 083/165] Fix examples/storage/store, make it possible to delete with wildcard --- lib/zenohex/examples/storage/store.ex | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index 81f1d7c..170e89f 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -21,7 +21,8 @@ defmodule Zenohex.Examples.Storage.Store do @impl true def delete(key_expr) do Agent.update(__MODULE__, fn map -> - Map.delete(map, key_expr) + find_keys(map, key_expr) + |> Enum.reduce(map, &Map.delete(&2, &1)) end) end @@ -30,7 +31,14 @@ defmodule Zenohex.Examples.Storage.Store do Agent.get( __MODULE__, fn map -> - samples = collect_samples(map, key_expr) + samples = + find_keys(map, key_expr) + |> Enum.reduce([], fn key, acc -> + case Map.get(map, key) do + nil -> acc + sample -> [sample | acc] + end + end) if samples == [] do {:error, :not_found} @@ -45,14 +53,7 @@ defmodule Zenohex.Examples.Storage.Store do Agent.get(__MODULE__, fn map -> map end) end - defp collect_samples(map, key_expr) do - Map.keys(map) - |> Enum.filter(&KeyExpr.intersects?(&1, key_expr)) - |> Enum.reduce([], fn key, acc -> - case Map.get(map, key) do - nil -> acc - sample -> [sample | acc] - end - end) + defp find_keys(map, key_expr) do + Map.keys(map) |> Enum.filter(&KeyExpr.intersects?(&1, key_expr)) end end From 4aed6cc658b9a3b14224c2a6c89e30a1a339e89f Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 09:23:02 +0900 Subject: [PATCH 084/165] Change return typespec, from {:error, String.t()} to {:error, any()} --- lib/zenohex.ex | 2 +- lib/zenohex/publisher.ex | 4 ++-- lib/zenohex/pull_subscriber.ex | 4 ++-- lib/zenohex/query.ex | 4 ++-- lib/zenohex/queryable.ex | 2 +- lib/zenohex/session.ex | 14 +++++++------- lib/zenohex/subscriber.ex | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/zenohex.ex b/lib/zenohex.ex index fb9b9a8..2f5bc80 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -13,7 +13,7 @@ defmodule Zenohex do iex> Zenohex.open() """ - @spec open :: {:ok, Session.t()} | {:error, reason :: String.t()} + @spec open :: {:ok, Session.t()} | {:error, reason :: any()} def open() do if System.get_env("SCOUTING_DELAY") == "0" do Nif.zenoh_scouting_delay_zero_session() diff --git a/lib/zenohex/publisher.ex b/lib/zenohex/publisher.ex index c2c7aa3..4ed85fb 100644 --- a/lib/zenohex/publisher.ex +++ b/lib/zenohex/publisher.ex @@ -37,7 +37,7 @@ defmodule Zenohex.Publisher do iex> :ok = Zenohex.Publisher.put(publisher, 0) iex> :ok = Zenohex.Publisher.put(publisher, 0.0) """ - @spec put(t(), binary() | integer() | float()) :: :ok | {:error, reason :: String.t()} + @spec put(t(), binary() | integer() | float()) :: :ok | {:error, reason :: any()} def put(publisher, value) when is_binary(value) do Nif.publisher_put_binary(publisher, value) end @@ -59,7 +59,7 @@ defmodule Zenohex.Publisher do iex> {:ok, publisher} = Zenohex.Session.declare_publisher(session, "key/expression") iex> :ok = Zenohex.Publisher.delete(publisher) """ - @spec delete(t()) :: :ok | {:error, reason :: String.t()} + @spec delete(t()) :: :ok | {:error, reason :: any()} def delete(publisher) do Nif.publisher_delete(publisher) end diff --git a/lib/zenohex/pull_subscriber.ex b/lib/zenohex/pull_subscriber.ex index d3d013e..2cf282d 100644 --- a/lib/zenohex/pull_subscriber.ex +++ b/lib/zenohex/pull_subscriber.ex @@ -18,7 +18,7 @@ defmodule Zenohex.PullSubscriber do iex> Zenohex.PullSubscriber.pull(pull_subscriber) :ok """ - @spec pull(t()) :: :ok | {:error, reason :: String.t()} + @spec pull(t()) :: :ok | {:error, reason :: any()} def pull(pull_subscriber) when is_reference(pull_subscriber) do Nif.pull_subscriber_pull(pull_subscriber) end @@ -37,7 +37,7 @@ defmodule Zenohex.PullSubscriber do {:ok, Sample.t()} | {:error, :timeout} | {:error, :disconnected} - | {:error, reason :: String.t()} + | {:error, reason :: any()} def recv_timeout(pull_subscriber, timeout_us) when is_reference(pull_subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.pull_subscriber_recv_timeout(pull_subscriber, timeout_us) diff --git a/lib/zenohex/query.ex b/lib/zenohex/query.ex index 0e64df9..1a20af1 100644 --- a/lib/zenohex/query.ex +++ b/lib/zenohex/query.ex @@ -25,12 +25,12 @@ defmodule Zenohex.Query do defstruct target: :best_matching, consolidation: :auto end - @spec reply(t(), Sample.t()) :: :ok | {:error, reason :: String.t()} + @spec reply(t(), Sample.t()) :: :ok | {:error, reason :: any()} def reply(query, sample) when is_struct(query, __MODULE__) and is_struct(sample, Sample) do Nif.query_reply(query, sample) end - @spec finish_reply(t()) :: :ok | {:error, reason :: String.t()} + @spec finish_reply(t()) :: :ok | {:error, reason :: any()} def finish_reply(query) when is_struct(query, __MODULE__) do Nif.query_finish_reply(query) end diff --git a/lib/zenohex/queryable.ex b/lib/zenohex/queryable.ex index fecfe33..ce5693c 100644 --- a/lib/zenohex/queryable.ex +++ b/lib/zenohex/queryable.ex @@ -32,7 +32,7 @@ defmodule Zenohex.Queryable do {:ok, Query.t()} | {:error, :timeout} | {:error, :disconnected} - | {:error, reason :: String.t()} + | {:error, reason :: any()} def recv_timeout(queryable, timeout_us) when is_reference(queryable) and is_integer(timeout_us) and timeout_us > 0 do Nif.queryable_recv_timeout(queryable, timeout_us) diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex index 2c36ea1..608aa21 100644 --- a/lib/zenohex/session.ex +++ b/lib/zenohex/session.ex @@ -23,7 +23,7 @@ defmodule Zenohex.Session do iex> Zenohex.Session.declare_publisher(session, "key/expression") """ @spec declare_publisher(t(), String.t(), Publisher.Options.t()) :: - {:ok, Publisher.t()} | {:error, reason :: String.t()} + {:ok, Publisher.t()} | {:error, reason :: any()} def declare_publisher(session, key_expr, opts \\ %Publisher.Options{}) when is_reference(session) and is_binary(key_expr) and is_struct(opts, Publisher.Options) do Nif.declare_publisher(session, key_expr, opts) @@ -38,7 +38,7 @@ defmodule Zenohex.Session do iex> Zenohex.Session.declare_subscriber(session, "key/expression") """ @spec declare_subscriber(t(), String.t(), Subscriber.Options.t()) :: - {:ok, Subscriber.t()} | {:error, reason :: String.t()} + {:ok, Subscriber.t()} | {:error, reason :: any()} def declare_subscriber(session, key_expr, opts \\ %Subscriber.Options{}) when is_reference(session) and is_binary(key_expr) and is_struct(opts, Subscriber.Options) do Nif.declare_subscriber(session, key_expr, opts) @@ -53,7 +53,7 @@ defmodule Zenohex.Session do iex> Zenohex.Session.declare_pull_subscriber(session, "key/expression") """ @spec declare_pull_subscriber(t(), String.t(), Subscriber.Options.t()) :: - {:ok, PullSubscriber.t()} | {:error, reason :: String.t()} + {:ok, PullSubscriber.t()} | {:error, reason :: any()} def declare_pull_subscriber(session, key_expr, opts \\ %Subscriber.Options{}) when is_reference(session) and is_binary(key_expr) and is_struct(opts, Subscriber.Options) do Nif.declare_pull_subscriber(session, key_expr, opts) @@ -68,7 +68,7 @@ defmodule Zenohex.Session do iex> Zenohex.Session.declare_queryable(session, "key/expression") """ @spec declare_queryable(t(), String.t(), Queryable.Options.t()) :: - {:ok, Queryable.t()} | {:error, reason :: String.t()} + {:ok, Queryable.t()} | {:error, reason :: any()} def declare_queryable(session, key_expr, opts \\ %Queryable.Options{}) when is_reference(session) and is_binary(key_expr) and is_struct(opts, Queryable.Options) do Nif.declare_queryable(session, key_expr, opts) @@ -85,7 +85,7 @@ defmodule Zenohex.Session do iex> :ok = Zenohex.Session.put(session, "key/expression", 0.0) """ @spec put(t(), String.t(), binary() | integer() | float()) :: - :ok | {:error, reason :: String.t()} + :ok | {:error, reason :: any()} def put(session, key_expr, value) when is_reference(session) and is_binary(key_expr) and is_binary(value) do Nif.session_put_binary(session, key_expr, value) @@ -131,7 +131,7 @@ defmodule Zenohex.Session do iex> Zenohex.Session.get_reply_receiver(session, "key/**") """ @spec get_reply_receiver(t(), String.t(), Query.Options.t()) :: - {:ok, receiver()} | {:error, reason :: String.t()} + {:ok, receiver()} | {:error, reason :: any()} def get_reply_receiver(session, selector, opts \\ %Query.Options{}) when is_reference(session) and is_binary(selector) and is_struct(opts, Query.Options) do Nif.session_get_reply_receiver(session, selector, opts) @@ -166,7 +166,7 @@ defmodule Zenohex.Session do iex> Zenohex.Session.delete(session, "key/expression") :ok """ - @spec delete(t(), String.t()) :: :ok | {:error, reason :: String.t()} + @spec delete(t(), String.t()) :: :ok | {:error, reason :: any()} def delete(session, key_expr) when is_reference(session) and is_binary(key_expr) do Nif.session_delete(session, key_expr) end diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex index 574d735..b9d6ebb 100644 --- a/lib/zenohex/subscriber.ex +++ b/lib/zenohex/subscriber.ex @@ -32,7 +32,7 @@ defmodule Zenohex.Subscriber do {:ok, Sample.t()} | {:error, :timeout} | {:error, :disconnected} - | {:error, reason :: String.t()} + | {:error, reason :: any()} def recv_timeout(subscriber, timeout_us) when is_reference(subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.subscriber_recv_timeout(subscriber, timeout_us) From 7166a6b321b2b238cff1f80365e1bea965192903 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 09:32:49 +0900 Subject: [PATCH 085/165] Fix credo issues, nested too deep --- lib/zenohex/examples/storage/queryable.ex | 5 +---- lib/zenohex/examples/storage/store.ex | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/zenohex/examples/storage/queryable.ex b/lib/zenohex/examples/storage/queryable.ex index 80d73a5..aaad20c 100644 --- a/lib/zenohex/examples/storage/queryable.ex +++ b/lib/zenohex/examples/storage/queryable.ex @@ -26,10 +26,7 @@ defmodule Zenohex.Examples.Storage.Queryable do nil {:ok, samples} -> - Enum.each(samples, fn sample -> - :ok = Query.reply(query, sample) - end) - + Enum.each(samples, &Query.reply(query, &1)) :ok = Query.finish_reply(query) # following line is not needed, this is just example of double call {:error, "ResponseFinal has already been sent"} = Query.finish_reply(query) diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index 170e89f..f40e15a 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -31,14 +31,7 @@ defmodule Zenohex.Examples.Storage.Store do Agent.get( __MODULE__, fn map -> - samples = - find_keys(map, key_expr) - |> Enum.reduce([], fn key, acc -> - case Map.get(map, key) do - nil -> acc - sample -> [sample | acc] - end - end) + samples = collect_samples(map, key_expr) if samples == [] do {:error, :not_found} @@ -56,4 +49,14 @@ defmodule Zenohex.Examples.Storage.Store do defp find_keys(map, key_expr) do Map.keys(map) |> Enum.filter(&KeyExpr.intersects?(&1, key_expr)) end + + defp collect_samples(map, key_expr) do + find_keys(map, key_expr) + |> Enum.reduce([], fn key, acc -> + case Map.get(map, key) do + nil -> acc + sample -> [sample | acc] + end + end) + end end From 39cd42ebf4ec94e770901c04e402649c8f6ae582 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 09:35:36 +0900 Subject: [PATCH 086/165] Change StorageBehaviour file location --- lib/zenohex/examples/storage/store.ex | 2 +- lib/zenohex/{ => examples}/storage_behaviour.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename lib/zenohex/{ => examples}/storage_behaviour.ex (86%) diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index f40e15a..690fdd5 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -1,5 +1,5 @@ defmodule Zenohex.Examples.Storage.Store do - @behaviour Zenohex.StorageBehaviour + @behaviour Zenohex.Examples.StorageBehaviour use Agent diff --git a/lib/zenohex/storage_behaviour.ex b/lib/zenohex/examples/storage_behaviour.ex similarity index 86% rename from lib/zenohex/storage_behaviour.ex rename to lib/zenohex/examples/storage_behaviour.ex index 23032fd..16161d6 100644 --- a/lib/zenohex/storage_behaviour.ex +++ b/lib/zenohex/examples/storage_behaviour.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.StorageBehaviour do +defmodule Zenohex.Examples.StorageBehaviour do alias Zenohex.Sample @callback put(key_expr :: String.t(), sample :: Sample.t()) :: :ok | {:error, reason :: any()} From 8b28e2cae3fce601b8b04916df4772cf1de8cab0 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 10:43:47 +0900 Subject: [PATCH 087/165] Add `@moduledoc false` to examples --- lib/zenohex/examples/publisher_server.ex | 2 ++ lib/zenohex/examples/pull_subscriber_server.ex | 2 ++ lib/zenohex/examples/queryable_server.ex | 2 ++ lib/zenohex/examples/session_server.ex | 2 ++ lib/zenohex/examples/storage.ex | 2 ++ lib/zenohex/examples/storage/queryable.ex | 2 ++ lib/zenohex/examples/storage/store.ex | 2 ++ lib/zenohex/examples/storage/subscriber.ex | 2 ++ lib/zenohex/examples/storage_behaviour.ex | 2 ++ lib/zenohex/examples/subscriber_server.ex | 2 ++ 10 files changed, 20 insertions(+) diff --git a/lib/zenohex/examples/publisher_server.ex b/lib/zenohex/examples/publisher_server.ex index 6633521..393e472 100644 --- a/lib/zenohex/examples/publisher_server.ex +++ b/lib/zenohex/examples/publisher_server.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.PublisherServer do + @moduledoc false + use GenServer alias Zenohex.Session diff --git a/lib/zenohex/examples/pull_subscriber_server.ex b/lib/zenohex/examples/pull_subscriber_server.ex index 7a56aad..b79bfcb 100644 --- a/lib/zenohex/examples/pull_subscriber_server.ex +++ b/lib/zenohex/examples/pull_subscriber_server.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.PullSubscriberServer do + @moduledoc false + use GenServer require Logger diff --git a/lib/zenohex/examples/queryable_server.ex b/lib/zenohex/examples/queryable_server.ex index 42adea6..4f717f2 100644 --- a/lib/zenohex/examples/queryable_server.ex +++ b/lib/zenohex/examples/queryable_server.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.QueryableServer do + @moduledoc false + use GenServer require Logger diff --git a/lib/zenohex/examples/session_server.ex b/lib/zenohex/examples/session_server.ex index 6464f79..18deb85 100644 --- a/lib/zenohex/examples/session_server.ex +++ b/lib/zenohex/examples/session_server.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.SessionServer do + @moduledoc false + use GenServer require Logger diff --git a/lib/zenohex/examples/storage.ex b/lib/zenohex/examples/storage.ex index 8806bc4..04c4e9c 100644 --- a/lib/zenohex/examples/storage.ex +++ b/lib/zenohex/examples/storage.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.Storage do + @moduledoc false + use Supervisor alias Zenohex.Examples.Storage diff --git a/lib/zenohex/examples/storage/queryable.ex b/lib/zenohex/examples/storage/queryable.ex index aaad20c..218c415 100644 --- a/lib/zenohex/examples/storage/queryable.ex +++ b/lib/zenohex/examples/storage/queryable.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.Storage.Queryable do + @moduledoc false + use GenServer require Logger diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index 690fdd5..0bd2754 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.Storage.Store do + @moduledoc false + @behaviour Zenohex.Examples.StorageBehaviour use Agent diff --git a/lib/zenohex/examples/storage/subscriber.ex b/lib/zenohex/examples/storage/subscriber.ex index 82d03eb..a880ad9 100644 --- a/lib/zenohex/examples/storage/subscriber.ex +++ b/lib/zenohex/examples/storage/subscriber.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.Storage.Subscriber do + @moduledoc false + use GenServer require Logger diff --git a/lib/zenohex/examples/storage_behaviour.ex b/lib/zenohex/examples/storage_behaviour.ex index 16161d6..3f3b24c 100644 --- a/lib/zenohex/examples/storage_behaviour.ex +++ b/lib/zenohex/examples/storage_behaviour.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.StorageBehaviour do + @moduledoc false + alias Zenohex.Sample @callback put(key_expr :: String.t(), sample :: Sample.t()) :: :ok | {:error, reason :: any()} diff --git a/lib/zenohex/examples/subscriber_server.ex b/lib/zenohex/examples/subscriber_server.ex index 74c54b8..a56308e 100644 --- a/lib/zenohex/examples/subscriber_server.ex +++ b/lib/zenohex/examples/subscriber_server.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Examples.SubscriberServer do + @moduledoc false + use GenServer require Logger From 0e75985ec9f8d2a2b96c01396bae0b5664d78b78 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 10:50:15 +0900 Subject: [PATCH 088/165] Add document to KeyExpr.intersects/2 --- lib/zenohex/keyexpr.ex | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/zenohex/keyexpr.ex b/lib/zenohex/keyexpr.ex index 8b8c73e..23ccdc6 100644 --- a/lib/zenohex/keyexpr.ex +++ b/lib/zenohex/keyexpr.ex @@ -1,8 +1,16 @@ defmodule Zenohex.KeyExpr do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + alias Zenohex.Nif + @doc ~S""" + Returns true if the keyexprs intersect. + i.e. there exists at least one key which is contained in both of the sets defined by key_expr1 and key_expr2. + """ @spec intersects?(String.t(), String.t()) :: boolean() - def intersects?(l, r) when is_binary(l) and is_binary(r) do - Nif.key_expr_intersects(l, r) + def intersects?(key_expr1, key_expr2) when is_binary(key_expr1) and is_binary(key_expr2) do + Nif.key_expr_intersects(key_expr1, key_expr2) end end From b1ff76f4a7aae8d3a53fe64560383e4988f8bec6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 10:53:27 +0900 Subject: [PATCH 089/165] Add credo to .github/workflows/ci.yaml --- .github/workflows/ci.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1ec7b6a..eb46413 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -42,3 +42,6 @@ jobs: - name: compile & test run: mix test --warnings-as-errors + + - name: credo + run: mix credo --all From 563eb100402ab40ecdfbf6f2ad1267076425eed9 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 11:16:37 +0900 Subject: [PATCH 090/165] Add default timeout_us, 1ms Normally users do not need to change this value. --- lib/zenohex/examples/pull_subscriber_server.ex | 2 +- lib/zenohex/examples/queryable_server.ex | 2 +- lib/zenohex/examples/session_server.ex | 2 +- lib/zenohex/examples/storage/queryable.ex | 2 +- lib/zenohex/examples/storage/subscriber.ex | 2 +- lib/zenohex/examples/subscriber_server.ex | 2 +- lib/zenohex/pull_subscriber.ex | 5 +++-- lib/zenohex/queryable.ex | 5 +++-- lib/zenohex/session.ex | 5 +++-- lib/zenohex/subscriber.ex | 5 +++-- test/zenohex_test.exs | 2 +- 11 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/zenohex/examples/pull_subscriber_server.ex b/lib/zenohex/examples/pull_subscriber_server.ex index b79bfcb..ae748a4 100644 --- a/lib/zenohex/examples/pull_subscriber_server.ex +++ b/lib/zenohex/examples/pull_subscriber_server.ex @@ -28,7 +28,7 @@ defmodule Zenohex.Examples.PullSubscriberServer do end def handle_info(:loop, state) do - case PullSubscriber.recv_timeout(state.pull_subscriber, 1000) do + case PullSubscriber.recv_timeout(state.pull_subscriber) do {:ok, sample} -> state.callback.(sample) send(self(), :loop) diff --git a/lib/zenohex/examples/queryable_server.ex b/lib/zenohex/examples/queryable_server.ex index 4f717f2..f458b9b 100644 --- a/lib/zenohex/examples/queryable_server.ex +++ b/lib/zenohex/examples/queryable_server.ex @@ -24,7 +24,7 @@ defmodule Zenohex.Examples.QueryableServer do end def handle_info(:loop, state) do - case Queryable.recv_timeout(state.queryable, 1000) do + case Queryable.recv_timeout(state.queryable) do {:ok, query} -> state.callback.(query) send(self(), :loop) diff --git a/lib/zenohex/examples/session_server.ex b/lib/zenohex/examples/session_server.ex index 18deb85..7180add 100644 --- a/lib/zenohex/examples/session_server.ex +++ b/lib/zenohex/examples/session_server.ex @@ -69,7 +69,7 @@ defmodule Zenohex.Examples.SessionServer do end def handle_info(:get_reply, state) do - case Session.get_reply_timeout(state.receiver, 1000) do + case Session.get_reply_timeout(state.receiver) do {:ok, sample} -> state.callback.(sample) send(self(), :get_reply) diff --git a/lib/zenohex/examples/storage/queryable.ex b/lib/zenohex/examples/storage/queryable.ex index 218c415..2e9d35e 100644 --- a/lib/zenohex/examples/storage/queryable.ex +++ b/lib/zenohex/examples/storage/queryable.ex @@ -21,7 +21,7 @@ defmodule Zenohex.Examples.Storage.Queryable do end def handle_info(:loop, state) do - case Queryable.recv_timeout(state.queryable, 1000) do + case Queryable.recv_timeout(state.queryable) do {:ok, query} -> case store(query) do {:error, :not_found} -> diff --git a/lib/zenohex/examples/storage/subscriber.ex b/lib/zenohex/examples/storage/subscriber.ex index a880ad9..713cc48 100644 --- a/lib/zenohex/examples/storage/subscriber.ex +++ b/lib/zenohex/examples/storage/subscriber.ex @@ -21,7 +21,7 @@ defmodule Zenohex.Examples.Storage.Subscriber do end def handle_info(:loop, state) do - case Subscriber.recv_timeout(state.subscriber, 1000) do + case Subscriber.recv_timeout(state.subscriber) do {:ok, sample} -> store(sample) {:error, :timeout} -> nil {:error, reason} -> Logger.error(inspect(reason)) diff --git a/lib/zenohex/examples/subscriber_server.ex b/lib/zenohex/examples/subscriber_server.ex index a56308e..d1a3b81 100644 --- a/lib/zenohex/examples/subscriber_server.ex +++ b/lib/zenohex/examples/subscriber_server.ex @@ -24,7 +24,7 @@ defmodule Zenohex.Examples.SubscriberServer do end def handle_info(:loop, state) do - case Subscriber.recv_timeout(state.subscriber, 1000) do + case Subscriber.recv_timeout(state.subscriber) do {:ok, sample} -> state.callback.(sample) send(self(), :loop) diff --git a/lib/zenohex/pull_subscriber.ex b/lib/zenohex/pull_subscriber.ex index 2cf282d..a781118 100644 --- a/lib/zenohex/pull_subscriber.ex +++ b/lib/zenohex/pull_subscriber.ex @@ -25,12 +25,13 @@ defmodule Zenohex.PullSubscriber do @doc """ Receive data. + Normally users don't need to change the default timeout_us. ## Examples iex> {:ok, session} = Zenohex.open() iex> {:ok, pull_subscriber} = Zenohex.Session.declare_pull_subscriber(session, "key/expression") - iex> Zenohex.PullSubscriber.recv_timeout(pull_subscriber, 1000) + iex> Zenohex.PullSubscriber.recv_timeout(pull_subscriber) {:error, :timeout} """ @spec recv_timeout(t(), pos_integer()) :: @@ -38,7 +39,7 @@ defmodule Zenohex.PullSubscriber do | {:error, :timeout} | {:error, :disconnected} | {:error, reason :: any()} - def recv_timeout(pull_subscriber, timeout_us) + def recv_timeout(pull_subscriber, timeout_us \\ 1000) when is_reference(pull_subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.pull_subscriber_recv_timeout(pull_subscriber, timeout_us) end diff --git a/lib/zenohex/queryable.ex b/lib/zenohex/queryable.ex index ce5693c..a20b052 100644 --- a/lib/zenohex/queryable.ex +++ b/lib/zenohex/queryable.ex @@ -20,12 +20,13 @@ defmodule Zenohex.Queryable do @doc """ Receive query. + Normally users don't need to change the default timeout_us. ## Examples iex> {:ok, session} = Zenohex.open() iex> {:ok, queryable} = Zenohex.Session.declare_queryable(session, "key/expression") - iex> Zenohex.Queryable.recv_timeout(queryable, 1000) + iex> Zenohex.Queryable.recv_timeout(queryable) {:error, :timeout} """ @spec recv_timeout(t(), pos_integer()) :: @@ -33,7 +34,7 @@ defmodule Zenohex.Queryable do | {:error, :timeout} | {:error, :disconnected} | {:error, reason :: any()} - def recv_timeout(queryable, timeout_us) + def recv_timeout(queryable, timeout_us \\ 1000) when is_reference(queryable) and is_integer(timeout_us) and timeout_us > 0 do Nif.queryable_recv_timeout(queryable, timeout_us) end diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex index 608aa21..f7a752c 100644 --- a/lib/zenohex/session.ex +++ b/lib/zenohex/session.ex @@ -139,12 +139,13 @@ defmodule Zenohex.Session do @doc ~S""" Query data from receiver. + Normally users don't need to change the default timeout_us. ## Examples iex> {:ok, session} = Zenohex.open() iex> {:ok, receiver} = Zenohex.Session.get_reply_receiver(session, "key/**") - iex> Zenohex.Session.get_reply_timeout(receiver, 1000) + iex> Zenohex.Session.get_reply_timeout(receiver) {:error, :disconnected} """ @spec get_reply_timeout(receiver(), pos_integer()) :: @@ -152,7 +153,7 @@ defmodule Zenohex.Session do | {:error, :timeout} | {:error, :disconnected} | {:error, reason :: any()} - def get_reply_timeout(receiver, timeout_us) + def get_reply_timeout(receiver, timeout_us \\ 1000) when is_reference(receiver) and is_integer(timeout_us) and timeout_us > 0 do Nif.session_get_reply_timeout(receiver, timeout_us) end diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex index b9d6ebb..092ec08 100644 --- a/lib/zenohex/subscriber.ex +++ b/lib/zenohex/subscriber.ex @@ -20,12 +20,13 @@ defmodule Zenohex.Subscriber do @doc """ Receive data. + Normally users don't need to change the default timeout_us. ## Examples iex> {:ok, session} = Zenohex.open() iex> {:ok, subscriber} = Zenohex.Session.declare_subscriber(session, "key/expression") - iex> Zenohex.Subscriber.recv_timeout(subscriber, 1000) + iex> Zenohex.Subscriber.recv_timeout(subscriber) {:error, :timeout} """ @spec recv_timeout(t(), pos_integer()) :: @@ -33,7 +34,7 @@ defmodule Zenohex.Subscriber do | {:error, :timeout} | {:error, :disconnected} | {:error, reason :: any()} - def recv_timeout(subscriber, timeout_us) + def recv_timeout(subscriber, timeout_us \\ 1000) when is_reference(subscriber) and is_integer(timeout_us) and timeout_us > 0 do Nif.subscriber_recv_timeout(subscriber, timeout_us) end diff --git a/test/zenohex_test.exs b/test/zenohex_test.exs index 6d25522..1410320 100644 --- a/test/zenohex_test.exs +++ b/test/zenohex_test.exs @@ -13,7 +13,7 @@ defmodule ZenohexTest do :ok = Zenohex.Publisher.put(publisher, "Hello Zenoh Dragon #{i}") {:ok, %Sample{key_expr: "pub/sub", value: value, kind: :put}} = - Zenohex.Subscriber.recv_timeout(subscriber, 1000) + Zenohex.Subscriber.recv_timeout(subscriber) assert value == "Hello Zenoh Dragon #{i}" end From 747a22fe66df034e6e7c556fa6368a9bea5702b4 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 11:22:45 +0900 Subject: [PATCH 091/165] Remove useless recv_timeout/1,2 return types from PullSubscriber, Queryable, Subscriber --- lib/zenohex/examples/pull_subscriber_server.ex | 3 --- lib/zenohex/examples/queryable_server.ex | 3 --- lib/zenohex/examples/subscriber_server.ex | 3 --- lib/zenohex/pull_subscriber.ex | 1 - lib/zenohex/queryable.ex | 1 - lib/zenohex/subscriber.ex | 1 - 6 files changed, 12 deletions(-) diff --git a/lib/zenohex/examples/pull_subscriber_server.ex b/lib/zenohex/examples/pull_subscriber_server.ex index ae748a4..05fc957 100644 --- a/lib/zenohex/examples/pull_subscriber_server.ex +++ b/lib/zenohex/examples/pull_subscriber_server.ex @@ -36,9 +36,6 @@ defmodule Zenohex.Examples.PullSubscriberServer do {:error, :timeout} -> send(self(), :loop) - {:error, :disconnected} -> - raise("unreachable!") - {:error, error} -> Logger.error(inspect(error)) end diff --git a/lib/zenohex/examples/queryable_server.ex b/lib/zenohex/examples/queryable_server.ex index f458b9b..d30ae88 100644 --- a/lib/zenohex/examples/queryable_server.ex +++ b/lib/zenohex/examples/queryable_server.ex @@ -32,9 +32,6 @@ defmodule Zenohex.Examples.QueryableServer do {:error, :timeout} -> send(self(), :loop) - {:error, :disconnected} -> - raise("unreachable!") - {:error, error} -> Logger.error(inspect(error)) end diff --git a/lib/zenohex/examples/subscriber_server.ex b/lib/zenohex/examples/subscriber_server.ex index d1a3b81..4c85a7e 100644 --- a/lib/zenohex/examples/subscriber_server.ex +++ b/lib/zenohex/examples/subscriber_server.ex @@ -32,9 +32,6 @@ defmodule Zenohex.Examples.SubscriberServer do {:error, :timeout} -> send(self(), :loop) - {:error, :disconnected} -> - raise("unreachable!") - {:error, error} -> Logger.error(inspect(error)) end diff --git a/lib/zenohex/pull_subscriber.ex b/lib/zenohex/pull_subscriber.ex index a781118..4992aee 100644 --- a/lib/zenohex/pull_subscriber.ex +++ b/lib/zenohex/pull_subscriber.ex @@ -37,7 +37,6 @@ defmodule Zenohex.PullSubscriber do @spec recv_timeout(t(), pos_integer()) :: {:ok, Sample.t()} | {:error, :timeout} - | {:error, :disconnected} | {:error, reason :: any()} def recv_timeout(pull_subscriber, timeout_us \\ 1000) when is_reference(pull_subscriber) and is_integer(timeout_us) and timeout_us > 0 do diff --git a/lib/zenohex/queryable.ex b/lib/zenohex/queryable.ex index a20b052..fbad429 100644 --- a/lib/zenohex/queryable.ex +++ b/lib/zenohex/queryable.ex @@ -32,7 +32,6 @@ defmodule Zenohex.Queryable do @spec recv_timeout(t(), pos_integer()) :: {:ok, Query.t()} | {:error, :timeout} - | {:error, :disconnected} | {:error, reason :: any()} def recv_timeout(queryable, timeout_us \\ 1000) when is_reference(queryable) and is_integer(timeout_us) and timeout_us > 0 do diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex index 092ec08..265344d 100644 --- a/lib/zenohex/subscriber.ex +++ b/lib/zenohex/subscriber.ex @@ -32,7 +32,6 @@ defmodule Zenohex.Subscriber do @spec recv_timeout(t(), pos_integer()) :: {:ok, Sample.t()} | {:error, :timeout} - | {:error, :disconnected} | {:error, reason :: any()} def recv_timeout(subscriber, timeout_us \\ 1000) when is_reference(subscriber) and is_integer(timeout_us) and timeout_us > 0 do From 632f1922ea8f738203f08e7fa11cefa44bbafdfe Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 12:06:17 +0900 Subject: [PATCH 092/165] Add docs to Query functions --- lib/zenohex/query.ex | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/zenohex/query.ex b/lib/zenohex/query.ex index 1a20af1..abaf27d 100644 --- a/lib/zenohex/query.ex +++ b/lib/zenohex/query.ex @@ -25,11 +25,23 @@ defmodule Zenohex.Query do defstruct target: :best_matching, consolidation: :auto end + @doc ~S""" + Sends a reply to this Query. User can call `reply/2` multiple times to send multiple samples. + + > ### Warning {: .warning} + > Do not forget to call `finish_reply/1` to finish the reply. + """ @spec reply(t(), Sample.t()) :: :ok | {:error, reason :: any()} def reply(query, sample) when is_struct(query, __MODULE__) and is_struct(sample, Sample) do Nif.query_reply(query, sample) end + @doc ~S""" + Finish reply. + + > ### Warning {: .warning} + > `finish_reply/1` must be called after `reply/2`. + """ @spec finish_reply(t()) :: :ok | {:error, reason :: any()} def finish_reply(query) when is_struct(query, __MODULE__) do Nif.query_finish_reply(query) From 84f299257880d2914dbee61568e996bfc1ce7260 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 13:28:45 +0900 Subject: [PATCH 093/165] Enhance docs of each options --- lib/zenohex/publisher.ex | 2 ++ lib/zenohex/query.ex | 2 ++ lib/zenohex/queryable.ex | 2 ++ lib/zenohex/subscriber.ex | 2 ++ mix.exs | 13 ++++++++++++- 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/zenohex/publisher.ex b/lib/zenohex/publisher.ex index 4ed85fb..b819e75 100644 --- a/lib/zenohex/publisher.ex +++ b/lib/zenohex/publisher.ex @@ -10,6 +10,8 @@ defmodule Zenohex.Publisher do defmodule Options do @moduledoc """ Documentation for `#{__MODULE__}`. + + Used by `Zenohex.Session.declare_publisher/3`. """ @type t :: %__MODULE__{congestion_control: congestion_control(), priority: priority()} diff --git a/lib/zenohex/query.ex b/lib/zenohex/query.ex index abaf27d..ca7cb77 100644 --- a/lib/zenohex/query.ex +++ b/lib/zenohex/query.ex @@ -17,6 +17,8 @@ defmodule Zenohex.Query do defmodule Options do @moduledoc """ Documentation for `#{__MODULE__}`. + + Used by `Zenohex.Session.get_timeout/4` and `Zenohex.Session.get_reply_receiver/3`. """ @type t :: %__MODULE__{target: target(), consolidation: consolidation()} diff --git a/lib/zenohex/queryable.ex b/lib/zenohex/queryable.ex index fbad429..5ff7bc1 100644 --- a/lib/zenohex/queryable.ex +++ b/lib/zenohex/queryable.ex @@ -11,6 +11,8 @@ defmodule Zenohex.Queryable do defmodule Options do @moduledoc """ Documentation for `#{__MODULE__}`. + + Used by `Zenohex.Session.declare_queryable/3`. """ @type t :: %__MODULE__{complete: complete()} diff --git a/lib/zenohex/subscriber.ex b/lib/zenohex/subscriber.ex index 265344d..a10c0ee 100644 --- a/lib/zenohex/subscriber.ex +++ b/lib/zenohex/subscriber.ex @@ -11,6 +11,8 @@ defmodule Zenohex.Subscriber do defmodule Options do @moduledoc """ Documentation for `#{__MODULE__}`. + + Used by `Zenohex.Session.declare_subscriber/3` and `Zenohex.Session.declare_pull_subscriber/3`. """ @type t :: %__MODULE__{reliability: reliability()} diff --git a/mix.exs b/mix.exs index 142bc1c..9c9a164 100644 --- a/mix.exs +++ b/mix.exs @@ -64,7 +64,18 @@ defmodule Zenohex.MixProject do end defp docs() do - [extras: ["README.md", "LICENSE"], main: "readme"] + [ + extras: ["README.md", "LICENSE"], + main: "readme", + groups_for_modules: [ + Options: [ + Zenohex.Publisher.Options, + Zenohex.Query.Options, + Zenohex.Queryable.Options, + Zenohex.Subscriber.Options + ] + ] + ] end defp disable_zenoh_delay(_args) do From b51f312a7e143fb5be356d84fcf096a940252824 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 13:49:12 +0900 Subject: [PATCH 094/165] Refactor Zenohex.Nif --- lib/zenohex/nif.ex | 86 +++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 63 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index f809a51..b02871f 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -22,91 +22,51 @@ defmodule Zenohex.Nif do alias Zenohex.Queryable alias Zenohex.Query - def zenoh_open() do - :erlang.nif_error(:nif_not_loaded) - end + defp err(), do: :erlang.nif_error(:nif_not_loaded) - def zenoh_scouting_delay_zero_session() do - :erlang.nif_error(:nif_not_loaded) - end + def zenoh_open(), do: err() + + def zenoh_scouting_delay_zero_session(), do: err() for type <- ["integer", "float", "binary"] do - def unquote(:"session_put_#{type}")(_session, _key_expr, _value) do - :erlang.nif_error(:nif_not_loaded) - end + def unquote(:"session_put_#{type}")(_session, _key_expr, _value), do: err() end - def session_get_reply_receiver(_session, _selector, _opts \\ %Query.Options{}) do - :erlang.nif_error(:nif_not_loaded) - end + def session_get_reply_receiver(_session, _selector, _opts \\ %Query.Options{}), do: err() - def session_get_reply_timeout(_receiver, _timeout_us) do - :erlang.nif_error(:nif_not_loaded) - end + def session_get_reply_timeout(_receiver, _timeout_us), do: err() - def session_delete(_session, _key_expr) do - :erlang.nif_error(:nif_not_loaded) - end + def session_delete(_session, _key_expr), do: err() - def declare_publisher(_session, _key_expr, _opts \\ %Publisher.Options{}) do - :erlang.nif_error(:nif_not_loaded) - end + def declare_publisher(_session, _key_expr, _opts \\ %Publisher.Options{}), do: err() for type <- ["integer", "float", "binary"] do - def unquote(:"publisher_put_#{type}")(_publisher, _value) do - :erlang.nif_error(:nif_not_loaded) - end + def unquote(:"publisher_put_#{type}")(_publisher, _value), do: err() end - def publisher_delete(_publisher) do - :erlang.nif_error(:nif_not_loaded) - end + def publisher_delete(_publisher), do: err() - def publisher_congestion_control(_publisher, _congestion_control) do - :erlang.nif_error(:nif_not_loaded) - end + def publisher_congestion_control(_publisher, _congestion_control), do: err() - def publisher_priority(_publisher, _priority) do - :erlang.nif_error(:nif_not_loaded) - end + def publisher_priority(_publisher, _priority), do: err() - def declare_subscriber(_session, _key_expr, _opts \\ %Subscriber.Options{}) do - :erlang.nif_error(:nif_not_loaded) - end + def declare_subscriber(_session, _key_expr, _opts \\ %Subscriber.Options{}), do: err() - def subscriber_recv_timeout(_subscriber, _timeout_us) do - :erlang.nif_error(:nif_not_loaded) - end + def subscriber_recv_timeout(_subscriber, _timeout_us), do: err() - def declare_pull_subscriber(_session, _key_expr, _opts \\ %Subscriber.Options{}) do - :erlang.nif_error(:nif_not_loaded) - end + def declare_pull_subscriber(_session, _key_expr, _opts \\ %Subscriber.Options{}), do: err() - def pull_subscriber_pull(_pull_subscriber) do - :erlang.nif_error(:nif_not_loaded) - end + def pull_subscriber_pull(_pull_subscriber), do: err() - def pull_subscriber_recv_timeout(_pull_subscriber, _timeout_us) do - :erlang.nif_error(:nif_not_loaded) - end + def pull_subscriber_recv_timeout(_pull_subscriber, _timeout_us), do: err() - def declare_queryable(_session, _key_expr, _opts \\ %Queryable.Options{}) do - :erlang.nif_error(:nif_not_loaded) - end + def declare_queryable(_session, _key_expr, _opts \\ %Queryable.Options{}), do: err() - def queryable_recv_timeout(_queryable, _timeout_us) do - :erlang.nif_error(:nif_not_loaded) - end + def queryable_recv_timeout(_queryable, _timeout_us), do: err() - def query_reply(_query, _sample) do - :erlang.nif_error(:nif_not_loaded) - end + def query_reply(_query, _sample), do: err() - def query_finish_reply(_query) do - :erlang.nif_error(:nif_not_loaded) - end + def query_finish_reply(_query), do: err() - def key_expr_intersects(_l, _r) do - :erlang.nif_error(:nif_not_loaded) - end + def key_expr_intersects(_key_expr1, _key_expr2), do: err() end From 15c0b569f17d5307d809f90eccba90b4dd84dcf6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 13:51:21 +0900 Subject: [PATCH 095/165] Add coverage to .github/workflows/ci.yaml --- .github/workflows/ci.yaml | 6 ++++-- mix.exs | 7 +++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index eb46413..c2f784a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -40,8 +40,10 @@ jobs: working-directory: native/zenohex_nif run: cargo fmt --all -- --check - - name: compile & test - run: mix test --warnings-as-errors + - name: test & coverage + run: | + mix test --warnings-as-errors + mix test --cover - name: credo run: mix credo --all diff --git a/mix.exs b/mix.exs index 9c9a164..b320d39 100644 --- a/mix.exs +++ b/mix.exs @@ -17,6 +17,7 @@ defmodule Zenohex.MixProject do name: "ZenohEx", source_url: @source_url, docs: docs(), + test_coverage: test_coverage(), aliases: [ {:test, [&disable_zenoh_delay/1, "test"]}, {:"test.watch", [&disable_zenoh_delay/1, "test.watch"]} @@ -78,6 +79,12 @@ defmodule Zenohex.MixProject do ] end + defp test_coverage() do + [ + ignore_modules: [Zenohex.Nif] + ] + end + defp disable_zenoh_delay(_args) do :ok = """ From d9533d518032a244cb6afbe4f4675389a92c0294 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 14:12:12 +0900 Subject: [PATCH 096/165] Enhance docs of Query and Sample --- lib/zenohex/query.ex | 2 ++ lib/zenohex/sample.ex | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/lib/zenohex/query.ex b/lib/zenohex/query.ex index ca7cb77..53100f4 100644 --- a/lib/zenohex/query.ex +++ b/lib/zenohex/query.ex @@ -1,6 +1,8 @@ defmodule Zenohex.Query do @moduledoc """ Documentation for `#{__MODULE__}`. + + Structs received by a `Zenohex.Queryable.recv_timeout/1`. """ alias Zenohex.Nif diff --git a/lib/zenohex/sample.ex b/lib/zenohex/sample.ex index 8ce0cef..81a8dde 100644 --- a/lib/zenohex/sample.ex +++ b/lib/zenohex/sample.ex @@ -1,6 +1,12 @@ defmodule Zenohex.Sample do @moduledoc """ Documentation for `#{__MODULE__}`. + + Structs received by + + * `Zenohex.Session.get_timeout/3` and `Zenohex.Session.get_reply_timeout/1` + * `Zenohex.Subscriber.recv_timeout/1` + * `Zenohex.PullSubscriber.recv_timeout/1` """ @type t :: %__MODULE__{ From 323c84f5ba27a4266ef09864675e8c93756a3f1c Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 14:30:22 +0900 Subject: [PATCH 097/165] Fix Session.get_timeout doc --- lib/zenohex/session.ex | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/zenohex/session.ex b/lib/zenohex/session.ex index f7a752c..d596483 100644 --- a/lib/zenohex/session.ex +++ b/lib/zenohex/session.ex @@ -102,12 +102,13 @@ defmodule Zenohex.Session do end @doc ~S""" - Get data from the matching queryables in the system. + Get one data from the matching queryables in the system. + To get multiple data, use `get_reply_receiver/2` and `get_reply_timeout/1` instead. ## Examples iex> {:ok, session} = Zenohex.open() - iex> Zenohex.Session.get_timeout(session, "key/**", 1000) + iex> Zenohex.Session.get_timeout(session, "key/expression", 1000) {:error, :disconnected} """ @spec get_timeout(t(), String.t(), pos_integer(), Query.Options.t()) :: From 456c7daaa2f29295ad9d958535161dd65c475e25 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 15:02:08 +0900 Subject: [PATCH 098/165] Refactor Examples.Storage --- lib/zenohex/examples/storage/store.ex | 2 +- .../{storage_behaviour.ex => storage/store_behaviour.ex} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename lib/zenohex/examples/{storage_behaviour.ex => storage/store_behaviour.ex} (85%) diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index 0bd2754..9b6d939 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -1,7 +1,7 @@ defmodule Zenohex.Examples.Storage.Store do @moduledoc false - @behaviour Zenohex.Examples.StorageBehaviour + @behaviour Zenohex.Examples.Storage.StoreBehaviour use Agent diff --git a/lib/zenohex/examples/storage_behaviour.ex b/lib/zenohex/examples/storage/store_behaviour.ex similarity index 85% rename from lib/zenohex/examples/storage_behaviour.ex rename to lib/zenohex/examples/storage/store_behaviour.ex index 3f3b24c..a92d769 100644 --- a/lib/zenohex/examples/storage_behaviour.ex +++ b/lib/zenohex/examples/storage/store_behaviour.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.StorageBehaviour do +defmodule Zenohex.Examples.Storage.StoreBehaviour do @moduledoc false alias Zenohex.Sample From d89e743890945aa5fcb68beec02712b7eca756a4 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 15:09:00 +0900 Subject: [PATCH 099/165] Refactor Examples.Subscriber --- .../examples/{subscriber_server.ex => subscriber/server.ex} | 2 +- test/zenohex/examples/publisher_server_test.exs | 6 +++--- test/zenohex/examples/session_server_test.exs | 6 +++--- test/zenohex/examples/subscriber_server_test.exs | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) rename lib/zenohex/examples/{subscriber_server.ex => subscriber/server.ex} (94%) diff --git a/lib/zenohex/examples/subscriber_server.ex b/lib/zenohex/examples/subscriber/server.ex similarity index 94% rename from lib/zenohex/examples/subscriber_server.ex rename to lib/zenohex/examples/subscriber/server.ex index 4c85a7e..8bf93ef 100644 --- a/lib/zenohex/examples/subscriber_server.ex +++ b/lib/zenohex/examples/subscriber/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.SubscriberServer do +defmodule Zenohex.Examples.Subscriber.Server do @moduledoc false use GenServer diff --git a/test/zenohex/examples/publisher_server_test.exs b/test/zenohex/examples/publisher_server_test.exs index 52dc305..e1da68e 100644 --- a/test/zenohex/examples/publisher_server_test.exs +++ b/test/zenohex/examples/publisher_server_test.exs @@ -2,7 +2,7 @@ defmodule Zenohex.Examples.PublisherTest do use ExUnit.Case alias Zenohex.Examples.PublisherServer - alias Zenohex.Examples.SubscriberServer + alias Zenohex.Examples.Subscriber alias Zenohex.Sample setup do @@ -18,7 +18,7 @@ defmodule Zenohex.Examples.PublisherTest do me = self() start_supervised!( - {SubscriberServer, + {Subscriber.Server, %{ session: session, key_expr: "key/expression/**", @@ -38,7 +38,7 @@ defmodule Zenohex.Examples.PublisherTest do me = self() start_supervised!( - {SubscriberServer, + {Subscriber.Server, %{ session: session, key_expr: "key/expression/**", diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_server_test.exs index 16f5d46..5b2504b 100644 --- a/test/zenohex/examples/session_server_test.exs +++ b/test/zenohex/examples/session_server_test.exs @@ -2,7 +2,7 @@ defmodule Zenohex.Examples.SessionServerTest do use ExUnit.Case alias Zenohex.Examples.SessionServer - alias Zenohex.Examples.SubscriberServer + alias Zenohex.Examples.Subscriber alias Zenohex.Examples.QueryableServer alias Zenohex.Query alias Zenohex.Sample @@ -21,7 +21,7 @@ defmodule Zenohex.Examples.SessionServerTest do me = self() start_supervised!( - {SubscriberServer, + {Subscriber.Server, %{ session: SessionServer.session(), key_expr: "key/expression/**", @@ -39,7 +39,7 @@ defmodule Zenohex.Examples.SessionServerTest do me = self() start_supervised!( - {SubscriberServer, + {Subscriber.Server, %{ session: SessionServer.session(), key_expr: "key/expression/**", diff --git a/test/zenohex/examples/subscriber_server_test.exs b/test/zenohex/examples/subscriber_server_test.exs index 7939712..a8d1cb2 100644 --- a/test/zenohex/examples/subscriber_server_test.exs +++ b/test/zenohex/examples/subscriber_server_test.exs @@ -1,7 +1,7 @@ defmodule Zenohex.Examples.SubscriberServerTest do use ExUnit.Case - alias Zenohex.Examples.SubscriberServer + alias Zenohex.Examples.Subscriber alias Zenohex.Session alias Zenohex.Sample @@ -13,7 +13,7 @@ defmodule Zenohex.Examples.SubscriberServerTest do callback = fn sample -> send(me, sample) end start_supervised!( - {SubscriberServer, %{session: session, key_expr: key_expr, callback: callback}} + {Subscriber.Server, %{session: session, key_expr: key_expr, callback: callback}} ) Session.put(session, "key/expression/put", "put") From 568b5394d32abd12c3324c8617b409e27140cf02 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 15:11:11 +0900 Subject: [PATCH 100/165] Refactor Examples.Publisher --- .../server.ex} | 2 +- .../zenohex/examples/publisher_server_test.exs | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) rename lib/zenohex/examples/{publisher_server.ex => publisher/server.ex} (96%) diff --git a/lib/zenohex/examples/publisher_server.ex b/lib/zenohex/examples/publisher/server.ex similarity index 96% rename from lib/zenohex/examples/publisher_server.ex rename to lib/zenohex/examples/publisher/server.ex index 393e472..5a1ed97 100644 --- a/lib/zenohex/examples/publisher_server.ex +++ b/lib/zenohex/examples/publisher/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.PublisherServer do +defmodule Zenohex.Examples.Publisher.Server do @moduledoc false use GenServer diff --git a/test/zenohex/examples/publisher_server_test.exs b/test/zenohex/examples/publisher_server_test.exs index e1da68e..0a2fbe5 100644 --- a/test/zenohex/examples/publisher_server_test.exs +++ b/test/zenohex/examples/publisher_server_test.exs @@ -1,14 +1,14 @@ -defmodule Zenohex.Examples.PublisherTest do +defmodule Zenohex.Examples.PublisherServerTest do use ExUnit.Case - alias Zenohex.Examples.PublisherServer + alias Zenohex.Examples.Publisher alias Zenohex.Examples.Subscriber alias Zenohex.Sample setup do {:ok, session} = Zenohex.open() key_expr = "key/expression/pub" - start_supervised!({PublisherServer, %{session: session, key_expr: key_expr}}) + start_supervised!({Publisher.Server, %{session: session, key_expr: key_expr}}) %{session: session} end @@ -27,7 +27,7 @@ defmodule Zenohex.Examples.PublisherTest do ) for i <- 0..100 do - assert PublisherServer.put(i) == :ok + assert Publisher.Server.put(i) == :ok assert_receive %Sample{key_expr: "key/expression/pub", kind: :put, value: ^i} end end @@ -46,18 +46,18 @@ defmodule Zenohex.Examples.PublisherTest do }} ) - assert PublisherServer.delete() == :ok + assert Publisher.Server.delete() == :ok assert_receive %Sample{key_expr: "key/expression/pub", kind: :delete} end end test "congestion_control/1" do - assert PublisherServer.congestion_control(:block) == :ok - assert PublisherServer.put("put") == :ok + assert Publisher.Server.congestion_control(:block) == :ok + assert Publisher.Server.put("put") == :ok end test "priority/1" do - assert PublisherServer.priority(:real_time) == :ok - assert PublisherServer.put("put") == :ok + assert Publisher.Server.priority(:real_time) == :ok + assert Publisher.Server.put("put") == :ok end end From efa4e52973e39699d131af052d69d2f528394510 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 15:15:39 +0900 Subject: [PATCH 101/165] Refactor Examples.Queryable --- .../examples/{queryable_server.ex => queryable/server.ex} | 2 +- test/zenohex/examples/queryable_server_test.exs | 4 ++-- test/zenohex/examples/session_server_test.exs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename lib/zenohex/examples/{queryable_server.ex => queryable/server.ex} (94%) diff --git a/lib/zenohex/examples/queryable_server.ex b/lib/zenohex/examples/queryable/server.ex similarity index 94% rename from lib/zenohex/examples/queryable_server.ex rename to lib/zenohex/examples/queryable/server.ex index d30ae88..6ad3dac 100644 --- a/lib/zenohex/examples/queryable_server.ex +++ b/lib/zenohex/examples/queryable/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.QueryableServer do +defmodule Zenohex.Examples.Queryable.Server do @moduledoc false use GenServer diff --git a/test/zenohex/examples/queryable_server_test.exs b/test/zenohex/examples/queryable_server_test.exs index be368d7..6969b50 100644 --- a/test/zenohex/examples/queryable_server_test.exs +++ b/test/zenohex/examples/queryable_server_test.exs @@ -3,7 +3,7 @@ defmodule Zenohex.Examples.QueryableServerTest do require Logger - alias Zenohex.Examples.QueryableServer + alias Zenohex.Examples.Queryable alias Zenohex.Session alias Zenohex.Query @@ -15,7 +15,7 @@ defmodule Zenohex.Examples.QueryableServerTest do callback = fn query -> send(me, query) end start_supervised!( - {QueryableServer, %{session: session, key_expr: key_expr, callback: callback}} + {Queryable.Server, %{session: session, key_expr: key_expr, callback: callback}} ) Session.get_timeout(session, key_expr, 1000) diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_server_test.exs index 5b2504b..155fb97 100644 --- a/test/zenohex/examples/session_server_test.exs +++ b/test/zenohex/examples/session_server_test.exs @@ -3,7 +3,7 @@ defmodule Zenohex.Examples.SessionServerTest do alias Zenohex.Examples.SessionServer alias Zenohex.Examples.Subscriber - alias Zenohex.Examples.QueryableServer + alias Zenohex.Examples.Queryable alias Zenohex.Query alias Zenohex.Sample @@ -64,7 +64,7 @@ defmodule Zenohex.Examples.SessionServerTest do test "with queryable" do start_supervised!( - {QueryableServer, + {Queryable.Server, %{ session: SessionServer.session(), key_expr: "key/expression/**", From 46433a2b059c880c7a73cd1152106a63936684fa Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 15:17:47 +0900 Subject: [PATCH 102/165] Refactor Examples.PullSubscriber --- .../server.ex} | 2 +- test/zenohex/examples/pull_subscriber_server_test.exs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename lib/zenohex/examples/{pull_subscriber_server.ex => pull_subscriber/server.ex} (95%) diff --git a/lib/zenohex/examples/pull_subscriber_server.ex b/lib/zenohex/examples/pull_subscriber/server.ex similarity index 95% rename from lib/zenohex/examples/pull_subscriber_server.ex rename to lib/zenohex/examples/pull_subscriber/server.ex index 05fc957..7584d9e 100644 --- a/lib/zenohex/examples/pull_subscriber_server.ex +++ b/lib/zenohex/examples/pull_subscriber/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.PullSubscriberServer do +defmodule Zenohex.Examples.PullSubscriber.Server do @moduledoc false use GenServer diff --git a/test/zenohex/examples/pull_subscriber_server_test.exs b/test/zenohex/examples/pull_subscriber_server_test.exs index a17c192..69b6a41 100644 --- a/test/zenohex/examples/pull_subscriber_server_test.exs +++ b/test/zenohex/examples/pull_subscriber_server_test.exs @@ -1,7 +1,7 @@ defmodule Zenohex.Examples.PullSubscriberServerTest do use ExUnit.Case - alias Zenohex.Examples.PullSubscriberServer + alias Zenohex.Examples.PullSubscriber alias Zenohex.Session alias Zenohex.Sample @@ -13,7 +13,7 @@ defmodule Zenohex.Examples.PullSubscriberServerTest do callback = fn sample -> send(me, sample) end start_supervised!( - {PullSubscriberServer, %{session: session, key_expr: key_expr, callback: callback}} + {PullSubscriber.Server, %{session: session, key_expr: key_expr, callback: callback}} ) Session.put(session, "key/expression/put", "put") @@ -29,14 +29,14 @@ defmodule Zenohex.Examples.PullSubscriberServerTest do callback = fn sample -> send(me, sample) end start_supervised!( - {PullSubscriberServer, %{session: session, key_expr: key_expr, callback: callback}} + {PullSubscriber.Server, %{session: session, key_expr: key_expr, callback: callback}} ) Session.put(session, "key/expression/put", "put") assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) refute_receive(%Sample{key_expr: "key/expression/put", value: "put"}) - PullSubscriberServer.pull() + PullSubscriber.Server.pull() assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) end end From 6fe37c8cc0dda5a4684c282cbb8c579b43a9b347 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 8 Feb 2024 15:19:36 +0900 Subject: [PATCH 103/165] Refactor Examples.Session --- .../{session_server.ex => session/server.ex} | 2 +- test/zenohex/examples/session_server_test.exs | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) rename lib/zenohex/examples/{session_server.ex => session/server.ex} (97%) diff --git a/lib/zenohex/examples/session_server.ex b/lib/zenohex/examples/session/server.ex similarity index 97% rename from lib/zenohex/examples/session_server.ex rename to lib/zenohex/examples/session/server.ex index 7180add..5e90af8 100644 --- a/lib/zenohex/examples/session_server.ex +++ b/lib/zenohex/examples/session/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.SessionServer do +defmodule Zenohex.Examples.Session.Server do @moduledoc false use GenServer diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_server_test.exs index 155fb97..50689f2 100644 --- a/test/zenohex/examples/session_server_test.exs +++ b/test/zenohex/examples/session_server_test.exs @@ -1,19 +1,19 @@ defmodule Zenohex.Examples.SessionServerTest do use ExUnit.Case - alias Zenohex.Examples.SessionServer + alias Zenohex.Examples.Session alias Zenohex.Examples.Subscriber alias Zenohex.Examples.Queryable alias Zenohex.Query alias Zenohex.Sample setup do - start_supervised!({SessionServer, nil}) + start_supervised!({Session.Server, nil}) :ok end test "session/2" do - assert is_reference(SessionServer.session()) + assert is_reference(Session.Server.session()) end describe "put/2" do @@ -23,13 +23,13 @@ defmodule Zenohex.Examples.SessionServerTest do start_supervised!( {Subscriber.Server, %{ - session: SessionServer.session(), + session: Session.Server.session(), key_expr: "key/expression/**", callback: fn sample -> send(me, sample) end }} ) - assert SessionServer.put("key/expression/put", "value") == :ok + assert Session.Server.put("key/expression/put", "value") == :ok assert_receive %Sample{key_expr: "key/expression/put", value: "value"} end end @@ -41,13 +41,13 @@ defmodule Zenohex.Examples.SessionServerTest do start_supervised!( {Subscriber.Server, %{ - session: SessionServer.session(), + session: Session.Server.session(), key_expr: "key/expression/**", callback: fn sample -> send(me, sample) end }} ) - assert SessionServer.delete("key/expression/delete") == :ok + assert Session.Server.delete("key/expression/delete") == :ok assert_receive %Sample{key_expr: "key/expression/delete", kind: :delete} end end @@ -56,9 +56,9 @@ defmodule Zenohex.Examples.SessionServerTest do test "without queryable" do me = self() callback = fn sample -> send(me, sample) end - :ok = SessionServer.set_disconnected_cb(fn -> send(me, :disconnected) end) + :ok = Session.Server.set_disconnected_cb(fn -> send(me, :disconnected) end) - assert SessionServer.get("key/expression/**", callback) == :ok + assert Session.Server.get("key/expression/**", callback) == :ok assert_receive :disconnected end @@ -66,7 +66,7 @@ defmodule Zenohex.Examples.SessionServerTest do start_supervised!( {Queryable.Server, %{ - session: SessionServer.session(), + session: Session.Server.session(), key_expr: "key/expression/**", callback: fn query -> :ok = Query.reply(query, %Sample{key_expr: "key/expression/reply"}) @@ -78,7 +78,7 @@ defmodule Zenohex.Examples.SessionServerTest do me = self() callback = fn sample -> send(me, sample) end - assert SessionServer.get("key/expression/**", callback) == :ok + assert Session.Server.get("key/expression/**", callback) == :ok assert_receive %Sample{} end end From f1b29b066b7120d59391da5d5d38a40bf5a23ccd Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 11:17:38 +0900 Subject: [PATCH 104/165] Add open!/0 to Zenohex --- lib/zenohex.ex | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/zenohex.ex b/lib/zenohex.ex index 2f5bc80..5b6f3db 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -21,4 +21,17 @@ defmodule Zenohex do Nif.zenoh_open() end end + + @doc ~S""" + Open a zenoh Session. + + ## Examples + + iex> Zenohex.open!() + """ + @spec open!() :: Session.t() + def open!() do + {:ok, session} = open() + session + end end From 69c6b75b6bb817d0a4b281cacec95ef44d59cdca Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 11:17:47 +0900 Subject: [PATCH 105/165] Fix typo --- lib/zenohex.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/zenohex.ex b/lib/zenohex.ex index 5b6f3db..78fd555 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -13,7 +13,7 @@ defmodule Zenohex do iex> Zenohex.open() """ - @spec open :: {:ok, Session.t()} | {:error, reason :: any()} + @spec open() :: {:ok, Session.t()} | {:error, reason :: any()} def open() do if System.get_env("SCOUTING_DELAY") == "0" do Nif.zenoh_scouting_delay_zero_session() From e1eb965a7e0a1714c7a85a2997f32d3415bd1231 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 11:19:02 +0900 Subject: [PATCH 106/165] Add docs to Examples.Publisher and refactor --- lib/zenohex/examples/publisher.ex | 85 +++++++++++++++++++ lib/zenohex/examples/publisher/server.ex | 2 +- .../examples/publisher_server_test.exs | 16 ++-- 3 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 lib/zenohex/examples/publisher.ex diff --git a/lib/zenohex/examples/publisher.ex b/lib/zenohex/examples/publisher.ex new file mode 100644 index 0000000..13beaea --- /dev/null +++ b/lib/zenohex/examples/publisher.ex @@ -0,0 +1,85 @@ +defmodule Zenohex.Examples.Publisher do + mix_config = Mix.Project.config() + version = mix_config[:version] + base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" + + @moduledoc """ + This is the example Publisher implementation using Zenohex. + + This Publisher is made of `m:Supervisor` and `m:GenServer`. + If you would like to see the codes, check the followings. + + * Supervisor + * [lib/zenohex/examples/publisher.ex](#{base_url}/publisher.ex) + * GenServer + * [lib/zenohex/examples/publisher/impl.ex](#{base_url}/publisher/impl.ex) + + ## Getting Started + + ### Start Publisher + + iex> alias Zenohex.Examples.Publisher + # if not specify session and key_expr, they are made internally. key_expr is "zenohex/examples/pub" + iex> Publisher.start_link() + # you can also inject your session and key_expr from outside + iex> Publisher.start_link(%{session: your_session, key_expr: "your_key/expression"}) + + ### Put data + + iex> Publisher.put(42) # integer + iex> Publisher.put(42.42) # float + iex> Publisher.put("42") # binary + + ### Delete data + + iex> Publisher.delete() + + ### Change Publisher options + + iex> Publisher.congestion_control(:block) + iex> Publisher.priority(:real_time) + + see. Supported options, `m:Zenohex.Publisher.Options` + """ + + use Supervisor + + alias Zenohex.Examples.Publisher + + @doc """ + Start Publisher. + """ + def start_link(args \\ %{}) when is_map(args) do + session = Map.get(args, :session, Zenohex.open!()) + key_expr = Map.get(args, :key_expr, "zenohex/examples/pub") + Supervisor.start_link(__MODULE__, %{session: session, key_expr: key_expr}, name: __MODULE__) + end + + @doc "Put data." + @spec put(integer() | float() | binary()) :: :ok + defdelegate put(value), to: Publisher.Impl + + @doc "Delete data." + @spec delete() :: :ok + defdelegate delete(), to: Publisher.Impl + + @doc "Change congestion control." + @spec congestion_control(Zenohex.Publisher.Options.congestion_control()) :: :ok + defdelegate congestion_control(option), to: Publisher.Impl + + @doc "Change priority." + @spec priority(Zenohex.Publisher.Options.priority()) :: :ok + defdelegate priority(option), to: Publisher.Impl + + @doc false + def init(args) when is_map(args) do + children = [ + {Publisher.Impl, args} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + @doc false + def child_spec(args), do: super(args) +end diff --git a/lib/zenohex/examples/publisher/server.ex b/lib/zenohex/examples/publisher/server.ex index 5a1ed97..f08efec 100644 --- a/lib/zenohex/examples/publisher/server.ex +++ b/lib/zenohex/examples/publisher/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.Publisher.Server do +defmodule Zenohex.Examples.Publisher.Impl do @moduledoc false use GenServer diff --git a/test/zenohex/examples/publisher_server_test.exs b/test/zenohex/examples/publisher_server_test.exs index 0a2fbe5..b170f6e 100644 --- a/test/zenohex/examples/publisher_server_test.exs +++ b/test/zenohex/examples/publisher_server_test.exs @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.PublisherServerTest do +defmodule Zenohex.Examples.PublisherTest do use ExUnit.Case alias Zenohex.Examples.Publisher @@ -8,7 +8,7 @@ defmodule Zenohex.Examples.PublisherServerTest do setup do {:ok, session} = Zenohex.open() key_expr = "key/expression/pub" - start_supervised!({Publisher.Server, %{session: session, key_expr: key_expr}}) + start_supervised!({Publisher, %{session: session, key_expr: key_expr}}) %{session: session} end @@ -27,7 +27,7 @@ defmodule Zenohex.Examples.PublisherServerTest do ) for i <- 0..100 do - assert Publisher.Server.put(i) == :ok + assert Publisher.put(i) == :ok assert_receive %Sample{key_expr: "key/expression/pub", kind: :put, value: ^i} end end @@ -46,18 +46,18 @@ defmodule Zenohex.Examples.PublisherServerTest do }} ) - assert Publisher.Server.delete() == :ok + assert Publisher.delete() == :ok assert_receive %Sample{key_expr: "key/expression/pub", kind: :delete} end end test "congestion_control/1" do - assert Publisher.Server.congestion_control(:block) == :ok - assert Publisher.Server.put("put") == :ok + assert Publisher.congestion_control(:block) == :ok + assert Publisher.put("put") == :ok end test "priority/1" do - assert Publisher.Server.priority(:real_time) == :ok - assert Publisher.Server.put("put") == :ok + assert Publisher.priority(:real_time) == :ok + assert Publisher.put("put") == :ok end end From 0c0821775c7ca988e870f5d4db63d0c58e519a6a Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 11:28:21 +0900 Subject: [PATCH 107/165] Rename examples/publisher files --- lib/zenohex/examples/publisher/{server.ex => impl.ex} | 0 .../examples/{publisher_server_test.exs => publisher_test.exs} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename lib/zenohex/examples/publisher/{server.ex => impl.ex} (100%) rename test/zenohex/examples/{publisher_server_test.exs => publisher_test.exs} (100%) diff --git a/lib/zenohex/examples/publisher/server.ex b/lib/zenohex/examples/publisher/impl.ex similarity index 100% rename from lib/zenohex/examples/publisher/server.ex rename to lib/zenohex/examples/publisher/impl.ex diff --git a/test/zenohex/examples/publisher_server_test.exs b/test/zenohex/examples/publisher_test.exs similarity index 100% rename from test/zenohex/examples/publisher_server_test.exs rename to test/zenohex/examples/publisher_test.exs From 0a57ae51fb16f936f58003f3e8c09961ed79a3e6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 12:01:40 +0900 Subject: [PATCH 108/165] Add docs to Examples.Subscriber and refactor --- lib/zenohex/examples/subscriber.ex | 67 +++++++++++++++++++ lib/zenohex/examples/subscriber/server.ex | 2 +- test/zenohex/examples/publisher_test.exs | 4 +- test/zenohex/examples/session_server_test.exs | 4 +- .../examples/subscriber_server_test.exs | 6 +- 5 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 lib/zenohex/examples/subscriber.ex diff --git a/lib/zenohex/examples/subscriber.ex b/lib/zenohex/examples/subscriber.ex new file mode 100644 index 0000000..f0171ac --- /dev/null +++ b/lib/zenohex/examples/subscriber.ex @@ -0,0 +1,67 @@ +defmodule Zenohex.Examples.Subscriber do + mix_config = Mix.Project.config() + version = mix_config[:version] + base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" + + @moduledoc """ + This is the example Subscriber implementation using Zenohex. + + This Subscriber is made of `m:Supervisor` and `m:GenServer`. + If you would like to see the codes, check the followings. + + * Supervisor + * [lib/zenohex/examples/subscriber.ex](#{base_url}/subscriber.ex) + * GenServer + * [lib/zenohex/examples/subscriber/impl.ex](#{base_url}/subscriber/impl.ex) + + ## Getting Started + + ### Start Subscriber + + iex> alias Zenohex.Examples.Subscriber + # if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**",callback is &Logger.debug(inspect(&1)) + iex> Subscriber.start_link() + # you can also inject your session, key_expr and callback from outside + iex> Subscriber.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) + + ### Subscribed? + + iex> alias Zenohex.Examples.Publisher + iex> Publisher.start_link() + iex> Publisher.put("subscribed?") + :ok + + 11:51:53.959 [debug] %Zenohex.Sample{key_expr: "zenohex/examples/pub", value: "subscribed?", kind: :put, reference: #Reference<0.1373489635.746717252.118288>} + """ + + use Supervisor + + require Logger + + alias Zenohex.Examples.Subscriber + + @doc """ + Start Subscriber. + """ + def start_link(args \\ %{}) when is_map(args) do + session = Map.get(args, :session, Zenohex.open!()) + key_expr = Map.get(args, :key_expr, "zenohex/examples/**") + callback = Map.get(args, :callback, &Logger.debug(inspect(&1))) + + Supervisor.start_link(__MODULE__, %{session: session, key_expr: key_expr, callback: callback}, + name: __MODULE__ + ) + end + + @doc false + def init(args) when is_map(args) do + children = [ + {Subscriber.Impl, args} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + @doc false + def child_spec(args), do: super(args) +end diff --git a/lib/zenohex/examples/subscriber/server.ex b/lib/zenohex/examples/subscriber/server.ex index 8bf93ef..d190263 100644 --- a/lib/zenohex/examples/subscriber/server.ex +++ b/lib/zenohex/examples/subscriber/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.Subscriber.Server do +defmodule Zenohex.Examples.Subscriber.Impl do @moduledoc false use GenServer diff --git a/test/zenohex/examples/publisher_test.exs b/test/zenohex/examples/publisher_test.exs index b170f6e..afc2ba0 100644 --- a/test/zenohex/examples/publisher_test.exs +++ b/test/zenohex/examples/publisher_test.exs @@ -18,7 +18,7 @@ defmodule Zenohex.Examples.PublisherTest do me = self() start_supervised!( - {Subscriber.Server, + {Subscriber, %{ session: session, key_expr: "key/expression/**", @@ -38,7 +38,7 @@ defmodule Zenohex.Examples.PublisherTest do me = self() start_supervised!( - {Subscriber.Server, + {Subscriber, %{ session: session, key_expr: "key/expression/**", diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_server_test.exs index 50689f2..75f3221 100644 --- a/test/zenohex/examples/session_server_test.exs +++ b/test/zenohex/examples/session_server_test.exs @@ -21,7 +21,7 @@ defmodule Zenohex.Examples.SessionServerTest do me = self() start_supervised!( - {Subscriber.Server, + {Subscriber, %{ session: Session.Server.session(), key_expr: "key/expression/**", @@ -39,7 +39,7 @@ defmodule Zenohex.Examples.SessionServerTest do me = self() start_supervised!( - {Subscriber.Server, + {Subscriber, %{ session: Session.Server.session(), key_expr: "key/expression/**", diff --git a/test/zenohex/examples/subscriber_server_test.exs b/test/zenohex/examples/subscriber_server_test.exs index a8d1cb2..131a60f 100644 --- a/test/zenohex/examples/subscriber_server_test.exs +++ b/test/zenohex/examples/subscriber_server_test.exs @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.SubscriberServerTest do +defmodule Zenohex.Examples.SubscriberTest do use ExUnit.Case alias Zenohex.Examples.Subscriber @@ -12,9 +12,7 @@ defmodule Zenohex.Examples.SubscriberServerTest do me = self() callback = fn sample -> send(me, sample) end - start_supervised!( - {Subscriber.Server, %{session: session, key_expr: key_expr, callback: callback}} - ) + start_supervised!({Subscriber, %{session: session, key_expr: key_expr, callback: callback}}) Session.put(session, "key/expression/put", "put") From 11390957c1661bd620f10c56b6cd8de53d783dca Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 12:02:28 +0900 Subject: [PATCH 109/165] Rename examples/subscriber files --- lib/zenohex/examples/subscriber/{server.ex => impl.ex} | 0 .../examples/{subscriber_server_test.exs => subscriber_test.exs} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename lib/zenohex/examples/subscriber/{server.ex => impl.ex} (100%) rename test/zenohex/examples/{subscriber_server_test.exs => subscriber_test.exs} (100%) diff --git a/lib/zenohex/examples/subscriber/server.ex b/lib/zenohex/examples/subscriber/impl.ex similarity index 100% rename from lib/zenohex/examples/subscriber/server.ex rename to lib/zenohex/examples/subscriber/impl.ex diff --git a/test/zenohex/examples/subscriber_server_test.exs b/test/zenohex/examples/subscriber_test.exs similarity index 100% rename from test/zenohex/examples/subscriber_server_test.exs rename to test/zenohex/examples/subscriber_test.exs From 76bd6e69a85975d8aac8881de3155366b5175cfc Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 12:26:33 +0900 Subject: [PATCH 110/165] Add docs to Examples.PullSubscriber and refactor --- lib/zenohex/examples/pull_subscriber.ex | 73 +++++++++++++++++++ .../examples/pull_subscriber/server.ex | 2 +- .../examples/pull_subscriber_server_test.exs | 8 +- 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 lib/zenohex/examples/pull_subscriber.ex diff --git a/lib/zenohex/examples/pull_subscriber.ex b/lib/zenohex/examples/pull_subscriber.ex new file mode 100644 index 0000000..54e94fe --- /dev/null +++ b/lib/zenohex/examples/pull_subscriber.ex @@ -0,0 +1,73 @@ +defmodule Zenohex.Examples.PullSubscriber do + mix_config = Mix.Project.config() + version = mix_config[:version] + base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" + + @moduledoc """ + This is the example PullSubscriber implementation using Zenohex. + + This PullSubscriber is made of `m:Supervisor` and `m:GenServer`. + If you would like to see the codes, check the followings. + + * Supervisor + * [lib/zenohex/examples/pull_subscriber.ex](#{base_url}/pull_subscriber.ex) + * GenServer + * [lib/zenohex/examples/pull_subscriber/impl.ex](#{base_url}/pull_subscriber/impl.ex) + + ## Getting Started + + ### Start PullSubscriber + + iex> alias Zenohex.Examples.PullSubscriber + # if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**",callback is &Logger.debug(inspect(&1)) + iex> PullSubscriber.start_link() + # you can also inject your session, key_expr and callback from outside + iex> PullSubscriber.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) + + ### Pull data + + iex> alias Zenohex.Examples.Publisher + iex> Publisher.start_link() + iex> Publisher.put("subscribed?") + :ok + iex> PullSubscriber.pull() + :ok + + 12:16:47.306 [debug] %Zenohex.Sample{key_expr: "zenohex/examples/pub", value: "subscribed?", kind: :put, reference: #Reference<0.662543409.1019347013.179304>} + """ + + use Supervisor + + require Logger + + alias Zenohex.Examples.PullSubscriber + + @doc """ + Start PullSubscriber. + """ + def start_link(args \\ %{}) when is_map(args) do + session = Map.get(args, :session, Zenohex.open!()) + key_expr = Map.get(args, :key_expr, "zenohex/examples/**") + callback = Map.get(args, :callback, &Logger.debug(inspect(&1))) + + Supervisor.start_link(__MODULE__, %{session: session, key_expr: key_expr, callback: callback}, + name: __MODULE__ + ) + end + + @doc "Pull data." + @spec pull() :: :ok + defdelegate pull(), to: PullSubscriber.Impl + + @doc false + def init(args) when is_map(args) do + children = [ + {PullSubscriber.Impl, args} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + @doc false + def child_spec(args), do: super(args) +end diff --git a/lib/zenohex/examples/pull_subscriber/server.ex b/lib/zenohex/examples/pull_subscriber/server.ex index 7584d9e..78d7a9a 100644 --- a/lib/zenohex/examples/pull_subscriber/server.ex +++ b/lib/zenohex/examples/pull_subscriber/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.PullSubscriber.Server do +defmodule Zenohex.Examples.PullSubscriber.Impl do @moduledoc false use GenServer diff --git a/test/zenohex/examples/pull_subscriber_server_test.exs b/test/zenohex/examples/pull_subscriber_server_test.exs index 69b6a41..9a72430 100644 --- a/test/zenohex/examples/pull_subscriber_server_test.exs +++ b/test/zenohex/examples/pull_subscriber_server_test.exs @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.PullSubscriberServerTest do +defmodule Zenohex.Examples.PullSubscriberTest do use ExUnit.Case alias Zenohex.Examples.PullSubscriber @@ -13,7 +13,7 @@ defmodule Zenohex.Examples.PullSubscriberServerTest do callback = fn sample -> send(me, sample) end start_supervised!( - {PullSubscriber.Server, %{session: session, key_expr: key_expr, callback: callback}} + {PullSubscriber, %{session: session, key_expr: key_expr, callback: callback}} ) Session.put(session, "key/expression/put", "put") @@ -29,14 +29,14 @@ defmodule Zenohex.Examples.PullSubscriberServerTest do callback = fn sample -> send(me, sample) end start_supervised!( - {PullSubscriber.Server, %{session: session, key_expr: key_expr, callback: callback}} + {PullSubscriber, %{session: session, key_expr: key_expr, callback: callback}} ) Session.put(session, "key/expression/put", "put") assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) refute_receive(%Sample{key_expr: "key/expression/put", value: "put"}) - PullSubscriber.Server.pull() + PullSubscriber.pull() assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) end end From 361f25ff2848ab898012510c3fdd0a1a410d05c1 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 12:31:32 +0900 Subject: [PATCH 111/165] Rename examples/pull_subscriber files --- lib/zenohex/examples/pull_subscriber/{server.ex => impl.ex} | 0 .../{pull_subscriber_server_test.exs => pull_subscriber_test.exs} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename lib/zenohex/examples/pull_subscriber/{server.ex => impl.ex} (100%) rename test/zenohex/examples/{pull_subscriber_server_test.exs => pull_subscriber_test.exs} (100%) diff --git a/lib/zenohex/examples/pull_subscriber/server.ex b/lib/zenohex/examples/pull_subscriber/impl.ex similarity index 100% rename from lib/zenohex/examples/pull_subscriber/server.ex rename to lib/zenohex/examples/pull_subscriber/impl.ex diff --git a/test/zenohex/examples/pull_subscriber_server_test.exs b/test/zenohex/examples/pull_subscriber_test.exs similarity index 100% rename from test/zenohex/examples/pull_subscriber_server_test.exs rename to test/zenohex/examples/pull_subscriber_test.exs From 62f5e788372d5b71a494c376857c2ba524dd929b Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 15:53:54 +0900 Subject: [PATCH 112/165] Add docs to Examples.Queryable, Examples.Session and refactor --- lib/zenohex/examples/queryable.ex | 67 +++++++++++++++ lib/zenohex/examples/queryable/server.ex | 2 +- lib/zenohex/examples/session.ex | 84 +++++++++++++++++++ lib/zenohex/examples/session/server.ex | 16 +--- .../examples/queryable_server_test.exs | 6 +- test/zenohex/examples/session_server_test.exs | 35 ++++---- 6 files changed, 177 insertions(+), 33 deletions(-) create mode 100644 lib/zenohex/examples/queryable.ex create mode 100644 lib/zenohex/examples/session.ex diff --git a/lib/zenohex/examples/queryable.ex b/lib/zenohex/examples/queryable.ex new file mode 100644 index 0000000..4f51922 --- /dev/null +++ b/lib/zenohex/examples/queryable.ex @@ -0,0 +1,67 @@ +defmodule Zenohex.Examples.Queryable do + mix_config = Mix.Project.config() + version = mix_config[:version] + base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" + + @moduledoc """ + This is the example Queryable implementation using Zenohex. + + This Queryable is made of `m:Supervisor` and `m:GenServer`. + If you would like to see the codes, check the followings. + + * Supervisor + * [lib/zenohex/examples/queryable.ex](#{base_url}/queryable.ex) + * GenServer + * [lib/zenohex/examples/queryable/impl.ex](#{base_url}/queryable/impl.ex) + + ## Getting Started + + ### Start Queryable + + iex> alias Zenohex.Examples.Queryable + # if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**", callback is &Logger.debug(inspect(&1)) + iex> Queryable.start_link() + # you can also inject your session, key_expr and callback from outside + iex> Queryable.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) + + ### Queried? + + iex> alias Zenohex.Examples.Session + iex> Session.start_link() + iex> Session.get("zenohex/examples/get", &IO.inspect/1) + :ok + + 15:20:17.870 [debug] %Zenohex.Query{key_expr: "zenohex/examples/get", parameters: "", value: :undefined, reference: #Reference<0.3076585362.3463839816.144434>} + """ + + use Supervisor + + require Logger + + alias Zenohex.Examples.Queryable + + @doc """ + Start Queryable. + """ + def start_link(args \\ %{}) when is_map(args) do + session = Map.get(args, :session, Zenohex.open!()) + key_expr = Map.get(args, :key_expr, "zenohex/examples/**") + callback = Map.get(args, :callback, &Logger.debug(inspect(&1))) + + Supervisor.start_link(__MODULE__, %{session: session, key_expr: key_expr, callback: callback}, + name: __MODULE__ + ) + end + + @doc false + def init(args) when is_map(args) do + children = [ + {Queryable.Impl, args} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + @doc false + def child_spec(args), do: super(args) +end diff --git a/lib/zenohex/examples/queryable/server.ex b/lib/zenohex/examples/queryable/server.ex index 6ad3dac..f205364 100644 --- a/lib/zenohex/examples/queryable/server.ex +++ b/lib/zenohex/examples/queryable/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.Queryable.Server do +defmodule Zenohex.Examples.Queryable.Impl do @moduledoc false use GenServer diff --git a/lib/zenohex/examples/session.ex b/lib/zenohex/examples/session.ex new file mode 100644 index 0000000..8b905ee --- /dev/null +++ b/lib/zenohex/examples/session.ex @@ -0,0 +1,84 @@ +defmodule Zenohex.Examples.Session do + mix_config = Mix.Project.config() + version = mix_config[:version] + base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" + + @moduledoc """ + This is the example Session implementation using Zenohex. + + This Session is made of `m:Supervisor` and `m:GenServer`. + If you would like to see the codes, check the followings. + + * Supervisor + * [lib/zenohex/examples/session.ex](#{base_url}/session.ex) + * GenServer + * [lib/zenohex/examples/session/impl.ex](#{base_url}/session/impl.ex) + + ## Getting Started + + ### Start Session + + iex> alias Zenohex.Examples.Session + # if not specify session, it is made internally + iex> Session.start_link() + # you can also inject your session and key_expr from outside + iex> Session.start_link(%{session: your_session}) + + ### Put data + + iex> Session.put("zenoh/example/session/put", 42) # integer + iex> Session.put("zenoh/example/session/put", 42.42) # float + iex> Session.put("zenoh/example/session/put", "42") # binary + + ### Delete data + + iex> Session.delete("zenoh/example/session/put") + iex> Session.delete("zenoh/example/session/**") + + ### Get data + + iex> callback = &IO.inspect/1 + iex> Session.get("zenoh/example/session/get", callback) + + """ + + use Supervisor + + alias Zenohex.Examples.Session + + @doc """ + Start Session. + """ + def start_link(args \\ %{}) when is_map(args) do + session = Map.get(args, :session, Zenohex.open!()) + Supervisor.start_link(__MODULE__, %{session: session}, name: __MODULE__) + end + + @doc "Put data." + @spec put(String.t(), integer() | float() | binary()) :: :ok + defdelegate put(key_expr, value), to: Session.Impl + + @doc "Delete data." + @spec delete(String.t()) :: :ok + defdelegate delete(key_expr), to: Session.Impl + + @doc "Set disconnected callback." + @spec set_disconnected_cb(function) :: :ok + defdelegate set_disconnected_cb(callback), to: Session.Impl + + @doc "Get data." + @spec get(String.t(), function()) :: :ok + defdelegate get(selector, callback), to: Session.Impl + + @doc false + def init(args) when is_map(args) do + children = [ + {Session.Impl, args} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + @doc false + def child_spec(args), do: super(args) +end diff --git a/lib/zenohex/examples/session/server.ex b/lib/zenohex/examples/session/server.ex index 5e90af8..a78421d 100644 --- a/lib/zenohex/examples/session/server.ex +++ b/lib/zenohex/examples/session/server.ex @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.Session.Server do +defmodule Zenohex.Examples.Session.Impl do @moduledoc false use GenServer @@ -11,10 +11,6 @@ defmodule Zenohex.Examples.Session.Server do GenServer.start_link(__MODULE__, args, name: __MODULE__) end - def session() do - GenServer.call(__MODULE__, :session) - end - def put(key_expr, value) do GenServer.call(__MODULE__, {:put, key_expr, value}) end @@ -31,12 +27,10 @@ defmodule Zenohex.Examples.Session.Server do GenServer.call(__MODULE__, {:get, selector, callback}) end - def init(_args) do - {:ok, session} = Zenohex.open() - + def init(args) do {:ok, %{ - session: session, + session: Map.fetch!(args, :session), selector: nil, receiver: nil, callback: nil, @@ -44,10 +38,6 @@ defmodule Zenohex.Examples.Session.Server do }} end - def handle_call(:session, _from, state) do - {:reply, state.session, state} - end - def handle_call({:put, key_expr, value}, _from, state) do ret = Session.put(state.session, key_expr, value) {:reply, ret, state} diff --git a/test/zenohex/examples/queryable_server_test.exs b/test/zenohex/examples/queryable_server_test.exs index 6969b50..8bd72de 100644 --- a/test/zenohex/examples/queryable_server_test.exs +++ b/test/zenohex/examples/queryable_server_test.exs @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.QueryableServerTest do +defmodule Zenohex.Examples.QueryableTest do use ExUnit.Case require Logger @@ -14,9 +14,7 @@ defmodule Zenohex.Examples.QueryableServerTest do me = self() callback = fn query -> send(me, query) end - start_supervised!( - {Queryable.Server, %{session: session, key_expr: key_expr, callback: callback}} - ) + start_supervised!({Queryable, %{session: session, key_expr: key_expr, callback: callback}}) Session.get_timeout(session, key_expr, 1000) diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_server_test.exs index 75f3221..4f46af1 100644 --- a/test/zenohex/examples/session_server_test.exs +++ b/test/zenohex/examples/session_server_test.exs @@ -1,4 +1,4 @@ -defmodule Zenohex.Examples.SessionServerTest do +defmodule Zenohex.Examples.SessionTest do use ExUnit.Case alias Zenohex.Examples.Session @@ -8,14 +8,10 @@ defmodule Zenohex.Examples.SessionServerTest do alias Zenohex.Sample setup do - start_supervised!({Session.Server, nil}) + start_supervised!({Session, %{}}) :ok end - test "session/2" do - assert is_reference(Session.Server.session()) - end - describe "put/2" do test "with subscriber" do me = self() @@ -23,13 +19,16 @@ defmodule Zenohex.Examples.SessionServerTest do start_supervised!( {Subscriber, %{ - session: Session.Server.session(), + session: Zenohex.open!(), key_expr: "key/expression/**", callback: fn sample -> send(me, sample) end }} ) - assert Session.Server.put("key/expression/put", "value") == :ok + # FIXME + Process.sleep(10) + + assert Session.put("key/expression/put", "value") == :ok assert_receive %Sample{key_expr: "key/expression/put", value: "value"} end end @@ -41,13 +40,16 @@ defmodule Zenohex.Examples.SessionServerTest do start_supervised!( {Subscriber, %{ - session: Session.Server.session(), + session: Zenohex.open!(), key_expr: "key/expression/**", callback: fn sample -> send(me, sample) end }} ) - assert Session.Server.delete("key/expression/delete") == :ok + # FIXME + Process.sleep(10) + + assert Session.delete("key/expression/delete") == :ok assert_receive %Sample{key_expr: "key/expression/delete", kind: :delete} end end @@ -56,17 +58,17 @@ defmodule Zenohex.Examples.SessionServerTest do test "without queryable" do me = self() callback = fn sample -> send(me, sample) end - :ok = Session.Server.set_disconnected_cb(fn -> send(me, :disconnected) end) + :ok = Session.set_disconnected_cb(fn -> send(me, :disconnected) end) - assert Session.Server.get("key/expression/**", callback) == :ok + assert Session.get("key/expression/**", callback) == :ok assert_receive :disconnected end test "with queryable" do start_supervised!( - {Queryable.Server, + {Queryable, %{ - session: Session.Server.session(), + session: Zenohex.open!(), key_expr: "key/expression/**", callback: fn query -> :ok = Query.reply(query, %Sample{key_expr: "key/expression/reply"}) @@ -75,10 +77,13 @@ defmodule Zenohex.Examples.SessionServerTest do }} ) + # FIXME + Process.sleep(10) + me = self() callback = fn sample -> send(me, sample) end - assert Session.Server.get("key/expression/**", callback) == :ok + assert Session.get("key/expression/**", callback) == :ok assert_receive %Sample{} end end From 013b94d0f2f09b43275e189a5b5a2c61b57f7a58 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 15:55:39 +0900 Subject: [PATCH 113/165] Rename examples/queryable, examples/session files --- lib/zenohex/examples/queryable/{server.ex => impl.ex} | 0 lib/zenohex/examples/session/{server.ex => impl.ex} | 0 .../examples/{queryable_server_test.exs => queryable_test.exs} | 0 .../examples/{session_server_test.exs => session_test.exs} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename lib/zenohex/examples/queryable/{server.ex => impl.ex} (100%) rename lib/zenohex/examples/session/{server.ex => impl.ex} (100%) rename test/zenohex/examples/{queryable_server_test.exs => queryable_test.exs} (100%) rename test/zenohex/examples/{session_server_test.exs => session_test.exs} (100%) diff --git a/lib/zenohex/examples/queryable/server.ex b/lib/zenohex/examples/queryable/impl.ex similarity index 100% rename from lib/zenohex/examples/queryable/server.ex rename to lib/zenohex/examples/queryable/impl.ex diff --git a/lib/zenohex/examples/session/server.ex b/lib/zenohex/examples/session/impl.ex similarity index 100% rename from lib/zenohex/examples/session/server.ex rename to lib/zenohex/examples/session/impl.ex diff --git a/test/zenohex/examples/queryable_server_test.exs b/test/zenohex/examples/queryable_test.exs similarity index 100% rename from test/zenohex/examples/queryable_server_test.exs rename to test/zenohex/examples/queryable_test.exs diff --git a/test/zenohex/examples/session_server_test.exs b/test/zenohex/examples/session_test.exs similarity index 100% rename from test/zenohex/examples/session_server_test.exs rename to test/zenohex/examples/session_test.exs From ff26f2b6a6dac337374a6949f24e0768a9753461 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 16:39:14 +0900 Subject: [PATCH 114/165] Add docs to Examples.Storage --- lib/zenohex/examples/storage.ex | 65 ++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/lib/zenohex/examples/storage.ex b/lib/zenohex/examples/storage.ex index 04c4e9c..f0d1948 100644 --- a/lib/zenohex/examples/storage.ex +++ b/lib/zenohex/examples/storage.ex @@ -1,18 +1,68 @@ defmodule Zenohex.Examples.Storage do - @moduledoc false + mix_config = Mix.Project.config() + version = mix_config[:version] + base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" + + @moduledoc """ + This is the example Storage implementation using Zenohex. + + This Storage is made of `m:Supervisor` and `m:GenServer`. + If you would like to see the codes, check the followings. + + * Supervisor + * [lib/zenohex/examples/storage.ex](#{base_url}/storage.ex) + * GenServer + * [lib/zenohex/examples/storage/store.ex](#{base_url}/storage/store.ex) + * [lib/zenohex/examples/storage/subscriber.ex](#{base_url}/storage/subscriber.ex) + * [lib/zenohex/examples/storage/queryable.ex](#{base_url}/storage/queryable.ex) + + In this example, we made store with `m:Agent`. We think we can use also `:ets`, `:dets` and `:mnesia`. + + ## Getting Started + + ### Start Storage + + iex> alias Zenohex.Examples.Storage + # if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**" + iex> Storage.start_link() + # you can also inject your session, key_expr and callback from outside + iex> Storage.start_link(%{session: your_session, key_expr: "your_key/expression/**"}) + + ### Session put/get/delete data with Storage + + iex> alias Zenohex.Examples.Session + iex> Session.start_link() + iex> Session.put("zenoh/examples/storage", _value = "put") + :ok + iex> Session.get("zenoh/examples/storage", _callback = &IO.inspect/1) + :ok + %Zenohex.Sample{ + key_expr: "zenohex/examples/storage", + value: "put", + kind: :put, + reference: #Reference<0.2244884903.1591869505.81651> + } + iex> Session.delete("zenoh/examples/storage") + :ok + iex> Session.get("zenoh/examples/storage", &IO.inspect/1) + :ok + """ use Supervisor alias Zenohex.Examples.Storage - def start_link(args) when is_map(args) do - Supervisor.start_link(__MODULE__, args, name: __MODULE__) + @doc """ + Start storage. + """ + def start_link(args \\ %{}) when is_map(args) do + session = Map.get(args, :session, Zenohex.open!()) + key_expr = Map.get(args, :key_expr, "zenohex/examples/**") + Supervisor.start_link(__MODULE__, %{session: session, key_expr: key_expr}, name: __MODULE__) end + @doc false def init(args) when is_map(args) do - true = Map.has_key?(args, :session) - true = Map.has_key?(args, :key_expr) - children = [ {Storage.Store, %{}}, {Storage.Subscriber, args}, @@ -21,4 +71,7 @@ defmodule Zenohex.Examples.Storage do Supervisor.init(children, strategy: :one_for_one) end + + @doc false + def child_spec(args), do: super(args) end From b5eba5be7c300651f7b0b99fd9f61edc0b558249 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 16:58:15 +0900 Subject: [PATCH 115/165] Modify example's receivers to receive immediately in init/1 --- lib/zenohex/examples/pull_subscriber/impl.ex | 23 ++++++++++++-------- lib/zenohex/examples/queryable/impl.ex | 15 ++++++++----- lib/zenohex/examples/subscriber/impl.ex | 13 +++++++---- test/zenohex/examples/session_test.exs | 9 -------- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/lib/zenohex/examples/pull_subscriber/impl.ex b/lib/zenohex/examples/pull_subscriber/impl.ex index 78d7a9a..a21dcf6 100644 --- a/lib/zenohex/examples/pull_subscriber/impl.ex +++ b/lib/zenohex/examples/pull_subscriber/impl.ex @@ -22,12 +22,24 @@ defmodule Zenohex.Examples.PullSubscriber.Impl do callback = Map.fetch!(args, :callback) {:ok, pull_subscriber} = Session.declare_pull_subscriber(session, key_expr) - send(self(), :loop) + state = %{pull_subscriber: pull_subscriber, callback: callback} + recv_timeout(state) - {:ok, %{pull_subscriber: pull_subscriber, callback: callback}} + {:ok, state} end def handle_info(:loop, state) do + recv_timeout(state) + + {:noreply, state} + end + + def handle_call(:pull, _from, state) do + :ok = PullSubscriber.pull(state.pull_subscriber) + {:reply, :ok, state} + end + + defp recv_timeout(state) do case PullSubscriber.recv_timeout(state.pull_subscriber) do {:ok, sample} -> state.callback.(sample) @@ -39,12 +51,5 @@ defmodule Zenohex.Examples.PullSubscriber.Impl do {:error, error} -> Logger.error(inspect(error)) end - - {:noreply, state} - end - - def handle_call(:pull, _from, state) do - :ok = PullSubscriber.pull(state.pull_subscriber) - {:reply, :ok, state} end end diff --git a/lib/zenohex/examples/queryable/impl.ex b/lib/zenohex/examples/queryable/impl.ex index f205364..c411fb3 100644 --- a/lib/zenohex/examples/queryable/impl.ex +++ b/lib/zenohex/examples/queryable/impl.ex @@ -16,14 +16,21 @@ defmodule Zenohex.Examples.Queryable.Impl do session = Map.fetch!(args, :session) key_expr = Map.fetch!(args, :key_expr) callback = Map.fetch!(args, :callback) - {:ok, queryable} = Session.declare_queryable(session, key_expr) - send(self(), :loop) + {:ok, queryable} = Session.declare_queryable(session, key_expr) + state = %{queryable: queryable, callback: callback} + recv_timeout(state) - {:ok, %{queryable: queryable, callback: callback}} + {:ok, state} end def handle_info(:loop, state) do + recv_timeout(state) + + {:noreply, state} + end + + defp recv_timeout(state) do case Queryable.recv_timeout(state.queryable) do {:ok, query} -> state.callback.(query) @@ -35,7 +42,5 @@ defmodule Zenohex.Examples.Queryable.Impl do {:error, error} -> Logger.error(inspect(error)) end - - {:noreply, state} end end diff --git a/lib/zenohex/examples/subscriber/impl.ex b/lib/zenohex/examples/subscriber/impl.ex index d190263..e2cea0d 100644 --- a/lib/zenohex/examples/subscriber/impl.ex +++ b/lib/zenohex/examples/subscriber/impl.ex @@ -18,12 +18,19 @@ defmodule Zenohex.Examples.Subscriber.Impl do callback = Map.fetch!(args, :callback) {:ok, subscriber} = Session.declare_subscriber(session, key_expr) - send(self(), :loop) + state = %{subscriber: subscriber, callback: callback} + recv_timeout(state) - {:ok, %{subscriber: subscriber, callback: callback}} + {:ok, state} end def handle_info(:loop, state) do + recv_timeout(state) + + {:noreply, state} + end + + defp recv_timeout(state) do case Subscriber.recv_timeout(state.subscriber) do {:ok, sample} -> state.callback.(sample) @@ -35,7 +42,5 @@ defmodule Zenohex.Examples.Subscriber.Impl do {:error, error} -> Logger.error(inspect(error)) end - - {:noreply, state} end end diff --git a/test/zenohex/examples/session_test.exs b/test/zenohex/examples/session_test.exs index 4f46af1..1d7bb9e 100644 --- a/test/zenohex/examples/session_test.exs +++ b/test/zenohex/examples/session_test.exs @@ -25,9 +25,6 @@ defmodule Zenohex.Examples.SessionTest do }} ) - # FIXME - Process.sleep(10) - assert Session.put("key/expression/put", "value") == :ok assert_receive %Sample{key_expr: "key/expression/put", value: "value"} end @@ -46,9 +43,6 @@ defmodule Zenohex.Examples.SessionTest do }} ) - # FIXME - Process.sleep(10) - assert Session.delete("key/expression/delete") == :ok assert_receive %Sample{key_expr: "key/expression/delete", kind: :delete} end @@ -77,9 +71,6 @@ defmodule Zenohex.Examples.SessionTest do }} ) - # FIXME - Process.sleep(10) - me = self() callback = fn sample -> send(me, sample) end From c53d91188795dcc69f8e9deb6beaea9c3981cb78 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 16:58:42 +0900 Subject: [PATCH 116/165] Make Example document group --- mix.exs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mix.exs b/mix.exs index b320d39..ab874d9 100644 --- a/mix.exs +++ b/mix.exs @@ -74,6 +74,14 @@ defmodule Zenohex.MixProject do Zenohex.Query.Options, Zenohex.Queryable.Options, Zenohex.Subscriber.Options + ], + Examples: [ + Zenohex.Examples.Publisher, + Zenohex.Examples.Subscriber, + Zenohex.Examples.PullSubscriber, + Zenohex.Examples.Session, + Zenohex.Examples.Queryable, + Zenohex.Examples.Storage ] ] ] From d0af0340684c15846abe6a491ffd3dec5424562b Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 17:21:02 +0900 Subject: [PATCH 117/165] Update README.md --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d7e1d2d..128875a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ by adding `zenohex` to your list of dependencies in `mix.exs`: ```elixir def deps do [ - {:zenohex, "~> 0.1.5"} + {:zenohex, "~> 0.2.0"} ] end ``` @@ -40,7 +40,7 @@ https://www.rust-lang.org/tools/install ## Getting Started -### Pub/Sub example +### Low layer Pub/Sub example ```sh $ iex -S mix @@ -61,6 +61,21 @@ iex(6)> Zenohex.Subscriber.recv_timeout(subscriber, 1000) {:error, :timeout} ``` +### Practical examples + +We implemented following practical examples under the [lib/zenohex/examples](lib/zenohex/examples) with moduledoc. + +(from hexdocs please refer to MODULES tab's EXAMPLE section) + +- [Publisher](lib/zenohex/examples/publisher.ex) +- [Subscriber](lib/zenohex/examples/subscriber.ex) +- [PullSubscriber](lib/zenohex/examples/pull_subscriber.ex) +- [Session](lib/zenohex/examples/session.ex) +- [Queryable](lib/zenohex/examples/queryable.ex) +- [Storage](lib/zenohex/examples/storage.ex) + +Use them as reference for your implementation. + ## For developer ### How to release From 471d7619411945a81fcdb024daa947bd23b67ed1 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 9 Feb 2024 22:19:41 +0900 Subject: [PATCH 118/165] Refactor keyexpr.rs --- native/zenohex_nif/src/keyexpr.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/native/zenohex_nif/src/keyexpr.rs b/native/zenohex_nif/src/keyexpr.rs index 5065423..68aca83 100644 --- a/native/zenohex_nif/src/keyexpr.rs +++ b/native/zenohex_nif/src/keyexpr.rs @@ -1,8 +1,8 @@ use zenoh::key_expr::{keyexpr, KeyExpr}; #[rustler::nif] -fn key_expr_intersects(l: String, r: String) -> bool { - let lke = unsafe { KeyExpr::from_string_unchecked(l) }; - let rke = unsafe { KeyExpr::from_string_unchecked(r) }; - keyexpr::intersects(&lke, &rke) +fn key_expr_intersects(key_expr1: &str, key_expr2: &str) -> bool { + let key_expr1 = unsafe { KeyExpr::from_str_uncheckend(key_expr1) }; + let key_expr2 = unsafe { KeyExpr::from_str_uncheckend(key_expr2) }; + keyexpr::intersects(&key_expr1, &key_expr2) } From 30f4fbc4f9aa573256056b26e2489d76bd974847 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 08:33:41 +0900 Subject: [PATCH 119/165] Add NOTE to session_get_reply_receiver/3 --- native/zenohex_nif/src/session.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/native/zenohex_nif/src/session.rs b/native/zenohex_nif/src/session.rs index 0111941..20a0a96 100644 --- a/native/zenohex_nif/src/session.rs +++ b/native/zenohex_nif/src/session.rs @@ -123,8 +123,10 @@ fn session_get_reply_receiver( selector: String, opts: crate::query::ExQueryOptions, ) -> Result, String> { + // NOTE: 引数に ExQuery を使うことが妥当と思うが、 + // zenoh の v1.0.0 前にそれらを考えるのが時期焦燥と判断し一旦このままとする + // TODO: with_value 対応も v1.0.0 が出たら検討する let session: &Arc = &resource.0; - // TODO: with_value の実装は用途が出てきたら検討 match session .get(selector) .target(opts.target.into()) From 28266383ca267c0e0caf4bcdb1cea7276e522f64 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 10:48:06 +0900 Subject: [PATCH 120/165] Add Config module --- lib/zenohex.ex | 16 +++++++++------- lib/zenohex/config.ex | 12 ++++++++++++ lib/zenohex/config/scouting.ex | 14 ++++++++++++++ lib/zenohex/nif.ex | 5 ++--- mix.exs | 4 ++++ native/zenohex_nif/src/config.rs | 32 ++++++++++++++++++++++++++++++++ native/zenohex_nif/src/lib.rs | 20 +++----------------- test/zenohex/nif_test.exs | 4 +++- 8 files changed, 79 insertions(+), 28 deletions(-) create mode 100644 lib/zenohex/config.ex create mode 100644 lib/zenohex/config/scouting.ex create mode 100644 native/zenohex_nif/src/config.rs diff --git a/lib/zenohex.ex b/lib/zenohex.ex index 78fd555..eb92d5d 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -5,6 +5,8 @@ defmodule Zenohex do alias Zenohex.Nif alias Zenohex.Session + alias Zenohex.Config + alias Zenohex.Config.Scouting @doc ~S""" Open a zenoh Session. @@ -13,12 +15,12 @@ defmodule Zenohex do iex> Zenohex.open() """ - @spec open() :: {:ok, Session.t()} | {:error, reason :: any()} - def open() do + @spec open(Config.t()) :: {:ok, Session.t()} | {:error, reason :: any()} + def open(config \\ %Config{}) do if System.get_env("SCOUTING_DELAY") == "0" do - Nif.zenoh_scouting_delay_zero_session() + Nif.zenoh_open(%Config{scouting: %Scouting{delay: 0}}) else - Nif.zenoh_open() + Nif.zenoh_open(config) end end @@ -29,9 +31,9 @@ defmodule Zenohex do iex> Zenohex.open!() """ - @spec open!() :: Session.t() - def open!() do - {:ok, session} = open() + @spec open!(Config.t()) :: Session.t() + def open!(config \\ %Config{}) do + {:ok, session} = open(config) session end end diff --git a/lib/zenohex/config.ex b/lib/zenohex/config.ex new file mode 100644 index 0000000..9000b0a --- /dev/null +++ b/lib/zenohex/config.ex @@ -0,0 +1,12 @@ +defmodule Zenohex.Config do + @moduledoc """ + Documentation for `#{__MODULE__}`. + + Used by `Zenohex.open/1`, `Zenohex.open!/1`. + """ + + alias Zenohex.Config.Scouting + + @type t :: %__MODULE__{scouting: Scouting.t()} + defstruct scouting: %Scouting{} +end diff --git a/lib/zenohex/config/scouting.ex b/lib/zenohex/config/scouting.ex new file mode 100644 index 0000000..c4fc20b --- /dev/null +++ b/lib/zenohex/config/scouting.ex @@ -0,0 +1,14 @@ +defmodule Zenohex.Config.Scouting do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + @type t :: %__MODULE__{delay: delay()} + + @typedoc """ + In peer mode, the period dedicated to scouting remote peers before attempting other operations. In milliseconds. + """ + @type delay :: non_neg_integer() | :undefined + + defstruct delay: :undefined +end diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index b02871f..de85950 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -21,12 +21,11 @@ defmodule Zenohex.Nif do alias Zenohex.Subscriber alias Zenohex.Queryable alias Zenohex.Query + alias Zenohex.Config defp err(), do: :erlang.nif_error(:nif_not_loaded) - def zenoh_open(), do: err() - - def zenoh_scouting_delay_zero_session(), do: err() + def zenoh_open(_config \\ %Config{}), do: err() for type <- ["integer", "float", "binary"] do def unquote(:"session_put_#{type}")(_session, _key_expr, _value), do: err() diff --git a/mix.exs b/mix.exs index ab874d9..b1cd3e7 100644 --- a/mix.exs +++ b/mix.exs @@ -69,6 +69,10 @@ defmodule Zenohex.MixProject do extras: ["README.md", "LICENSE"], main: "readme", groups_for_modules: [ + Configs: [ + Zenohex.Config, + Zenohex.Config.Scouting + ], Options: [ Zenohex.Publisher.Options, Zenohex.Query.Options, diff --git a/native/zenohex_nif/src/config.rs b/native/zenohex_nif/src/config.rs new file mode 100644 index 0000000..44e2ada --- /dev/null +++ b/native/zenohex_nif/src/config.rs @@ -0,0 +1,32 @@ +use rustler::ErlOption; + +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Config"] +pub(crate) struct ExConfig { + scouting: ExConfigScouting, +} + +impl From for zenoh::prelude::config::Config { + fn from(value: ExConfig) -> Self { + let mut config = zenoh::prelude::config::peer(); + config.scouting = value.scouting.into(); + config + } +} + +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Config.Scouting"] +pub(crate) struct ExConfigScouting { + delay: ErlOption, +} + +impl From for zenoh::prelude::config::ScoutingConf { + fn from(value: ExConfigScouting) -> Self { + let mut config = zenoh::prelude::config::ScoutingConf::default(); + let _ = match Option::::from(value.delay) { + Some(delay) => config.set_delay(Some(delay)), + None => config.set_delay(None), + }; + config + } +} diff --git a/native/zenohex_nif/src/lib.rs b/native/zenohex_nif/src/lib.rs index cbcf8ab..8dea25a 100644 --- a/native/zenohex_nif/src/lib.rs +++ b/native/zenohex_nif/src/lib.rs @@ -13,6 +13,7 @@ mod atoms { disconnected, } } +mod config; mod keyexpr; mod publisher; mod pull_subscriber; @@ -33,22 +34,8 @@ struct QueryRef(RwLock>); struct SampleRef(Sample); #[rustler::nif(schedule = "DirtyIo")] -fn zenoh_open() -> Result, String> { - let config = config::peer(); - match zenoh::open(config).res_sync() { - Ok(session) => Ok(ResourceArc::new(SessionRef(session.into_arc()))), - Err(error) => Err(error.to_string()), - } -} - -#[rustler::nif(schedule = "DirtyIo")] -fn zenoh_scouting_delay_zero_session() -> Result, String> { - let mut config = config::peer(); - let config = match config.scouting.set_delay(Some(0)) { - Ok(_) => config, - Err(_) => return Err("set_delay failed".to_string()), - }; - +fn zenoh_open(config: crate::config::ExConfig) -> Result, String> { + let config: zenoh::prelude::config::Config = config.into(); match zenoh::open(config).res_sync() { Ok(session) => Ok(ResourceArc::new(SessionRef(session.into_arc()))), Err(error) => Err(error.to_string()), @@ -71,7 +58,6 @@ rustler::init!( "Elixir.Zenohex.Nif", [ zenoh_open, - zenoh_scouting_delay_zero_session, session::declare_publisher, session::declare_subscriber, session::declare_pull_subscriber, diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index f97899a..f9e4712 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -2,10 +2,12 @@ defmodule Zenohex.NifTest do use ExUnit.Case, async: true alias Zenohex.Nif + alias Zenohex.Config + alias Zenohex.Config.Scouting alias Zenohex.Sample setup_all do - {:ok, session} = Nif.zenoh_open() + {:ok, session} = Nif.zenoh_open(%Config{scouting: %Scouting{delay: 0}}) %{session: session} end From 742c3f6faff8d449ee27e0d8882f434f301fc9a0 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 12:58:07 +0900 Subject: [PATCH 121/165] Add Config.Connect --- lib/zenohex/config.ex | 5 +++-- lib/zenohex/config/connect.ex | 14 ++++++++++++++ mix.exs | 1 + native/zenohex_nif/src/config.rs | 24 ++++++++++++++++++++++++ test/zenohex/config_test.exs | 16 ++++++++++++++++ 5 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 lib/zenohex/config/connect.ex create mode 100644 test/zenohex/config_test.exs diff --git a/lib/zenohex/config.ex b/lib/zenohex/config.ex index 9000b0a..03a18fb 100644 --- a/lib/zenohex/config.ex +++ b/lib/zenohex/config.ex @@ -5,8 +5,9 @@ defmodule Zenohex.Config do Used by `Zenohex.open/1`, `Zenohex.open!/1`. """ + alias Zenohex.Config.Connect alias Zenohex.Config.Scouting - @type t :: %__MODULE__{scouting: Scouting.t()} - defstruct scouting: %Scouting{} + @type t :: %__MODULE__{connect: Connect.t(), scouting: Scouting.t()} + defstruct connect: %Connect{}, scouting: %Scouting{} end diff --git a/lib/zenohex/config/connect.ex b/lib/zenohex/config/connect.ex new file mode 100644 index 0000000..21268cd --- /dev/null +++ b/lib/zenohex/config/connect.ex @@ -0,0 +1,14 @@ +defmodule Zenohex.Config.Connect do + @moduledoc """ + Documentation for `#{__MODULE__}`. + """ + + @type t :: %__MODULE__{endpoints: endpoints()} + + @typedoc """ + ex. ["tcp/192.168.1.1:7447", "tcp/192.168.1.2:7447"] + """ + @type endpoints() :: [String.t()] + + defstruct endpoints: [] +end diff --git a/mix.exs b/mix.exs index b1cd3e7..6eb134d 100644 --- a/mix.exs +++ b/mix.exs @@ -71,6 +71,7 @@ defmodule Zenohex.MixProject do groups_for_modules: [ Configs: [ Zenohex.Config, + Zenohex.Config.Connect, Zenohex.Config.Scouting ], Options: [ diff --git a/native/zenohex_nif/src/config.rs b/native/zenohex_nif/src/config.rs index 44e2ada..0c3868a 100644 --- a/native/zenohex_nif/src/config.rs +++ b/native/zenohex_nif/src/config.rs @@ -3,17 +3,41 @@ use rustler::ErlOption; #[derive(rustler::NifStruct)] #[module = "Zenohex.Config"] pub(crate) struct ExConfig { + connect: ExConfigConnect, scouting: ExConfigScouting, } impl From for zenoh::prelude::config::Config { fn from(value: ExConfig) -> Self { let mut config = zenoh::prelude::config::peer(); + config.connect = value.connect.into(); config.scouting = value.scouting.into(); config } } +#[derive(rustler::NifStruct)] +#[module = "Zenohex.Config.Connect"] +pub(crate) struct ExConfigConnect { + endpoints: Vec, +} + +impl From for zenoh::prelude::config::ConnectConfig { + fn from(value: ExConfigConnect) -> Self { + let endpoints = value + .endpoints + .iter() + .map(|endpoint| { + zenoh::prelude::config::EndPoint::try_from(endpoint.clone()) + .unwrap_or_else(|error| panic!("{}", error.to_string())) + }) + .collect(); + let mut config = zenoh::prelude::config::ConnectConfig::default(); + let _ = config.set_endpoints(endpoints); + config + } +} + #[derive(rustler::NifStruct)] #[module = "Zenohex.Config.Scouting"] pub(crate) struct ExConfigScouting { diff --git a/test/zenohex/config_test.exs b/test/zenohex/config_test.exs new file mode 100644 index 0000000..6f37fe1 --- /dev/null +++ b/test/zenohex/config_test.exs @@ -0,0 +1,16 @@ +defmodule Zenohex.ConfigTest do + use ExUnit.Case, async: true + + alias Zenohex.Config + alias Zenohex.Config.Connect + alias Zenohex.Config.Scouting + + test "" do + config = %Config{ + connect: %Connect{endpoints: ["tcp/localhost:7447"]}, + scouting: %Scouting{delay: 200} + } + + assert {:ok, _session} = Zenohex.open(config) + end +end From 9f9b0e97f6b1e22f70f90e58a4f33cb80e5d3fbb Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 13:17:13 +0900 Subject: [PATCH 122/165] Suppress not harmful dialyzer error This issue, https://github.com/rusterlium/rustler/issues/569, is already fixed by 570 but still not released. --- lib/zenohex/nif.ex | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index de85950..ba1312a 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -16,6 +16,8 @@ defmodule Zenohex.Nif do # for Nerves @compile {:autoload, false} + # suppress dialyzer error, remove this when https://github.com/rusterlium/rustler/pull/570 is released + @dialyzer :no_match alias Zenohex.Publisher alias Zenohex.Subscriber From 7351461c9d6521353b2b45f5bf5e926be4c2150a Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 14:35:41 +0900 Subject: [PATCH 123/165] Modify dialyzer settings --- .gitignore | 3 +++ mix.exs | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/.gitignore b/.gitignore index 2f3db49..ebee2f0 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,6 @@ zenohex-*.tar /tmp/ /priv/native/ + +/priv/plts/*.plt +/priv/plts/*.plt.hash diff --git a/mix.exs b/mix.exs index 6eb134d..8c92cf0 100644 --- a/mix.exs +++ b/mix.exs @@ -18,6 +18,7 @@ defmodule Zenohex.MixProject do source_url: @source_url, docs: docs(), test_coverage: test_coverage(), + dialyzer: dialyzer(), aliases: [ {:test, [&disable_zenoh_delay/1, "test"]}, {:"test.watch", [&disable_zenoh_delay/1, "test.watch"]} @@ -98,6 +99,13 @@ defmodule Zenohex.MixProject do ] end + defp dialyzer() do + [ + plt_file: {:no_warn, "priv/plts/project.plt"}, + plt_core_path: "priv/plts/core.plt" + ] + end + defp disable_zenoh_delay(_args) do :ok = """ From f1c40eb51e6f6842d7c462647c78154393c300e9 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 14:35:51 +0900 Subject: [PATCH 124/165] Enhance CI --- .github/workflows/ci.yaml | 95 ++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c2f784a..dfa9b6f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -3,25 +3,49 @@ name: CI env: OTP_VERSION: 26.1.2 ELIXIR_VERSION: 1.15.7 + MIX_ENV: test # based https://github.com/erlef/setup-beam on: push: branches: - - 'pojiro/0.2.0-dev' + - "pojiro/0.2.0-dev" jobs: - test: + build-deps: runs-on: ubuntu-latest - env: - MIX_ENV: test + steps: + - uses: actions/checkout@v4 + + - uses: erlef/setup-beam@v1 + id: setup-beam + with: + otp-version: ${{env.OTP_VERSION}} + elixir-version: ${{env.ELIXIR_VERSION}} + + - uses: actions/cache@v4 + id: save-deps-cache + with: + path: | + deps + _build + key: deps-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ hashFiles('**/*.lock') }} + + - name: build deps + if: steps.save-deps-cache.outputs.cache-hit != 'true' + run: mix do deps.get, deps.compile + + code-analysis: + needs: build-deps + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 + id: setup-beam with: otp-version: ${{env.OTP_VERSION}} elixir-version: ${{env.ELIXIR_VERSION}} @@ -30,8 +54,14 @@ jobs: with: components: rustfmt - - name: get deps - run: mix do deps.get, deps.compile + - uses: actions/cache/restore@v4 + id: restore-deps-cache + with: + path: | + deps + _build + key: deps-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ hashFiles('**/*.lock') }} + restore-keys: deps-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}- - name: format run: mix format --check-formatted @@ -40,10 +70,53 @@ jobs: working-directory: native/zenohex_nif run: cargo fmt --all -- --check - - name: test & coverage - run: | - mix test --warnings-as-errors - mix test --cover - - name: credo run: mix credo --all + + - name: restore plts cache + id: restore-plts-cache + uses: actions/cache/restore@v4 + with: + key: plts-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ hashFiles('**/*.lock') }} + restore-keys: plts-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}- + path: priv/plts + + - name: create plts + if: steps.restore-plts-cache.outputs.cache-hit != 'true' + run: mix dialyzer --plt + + - name: save plts cache + id: save-plts-cache + uses: actions/cache/save@v4 + if: steps.restore-plts-cache.outputs.cache-hit != 'true' + with: + key: plts-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ hashFiles('**/*.lock') }} + path: priv/plts + + - name: dialyzer + run: mix dialyzer --format github + + test: + needs: build-deps + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: erlef/setup-beam@v1 + id: setup-beam + with: + otp-version: ${{env.OTP_VERSION}} + elixir-version: ${{env.ELIXIR_VERSION}} + + - uses: actions/cache/restore@v4 + id: restore-deps-cache + with: + path: | + deps + _build + key: deps-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ hashFiles('**/*.lock') }} + restore-keys: deps-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}- + + - name: test + run: mix test --warnings-as-errors --cover From dd1fec194986b36f17dbb457cc57eabc317c871b Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 14:52:32 +0900 Subject: [PATCH 125/165] Fix docs name --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 8c92cf0..479df61 100644 --- a/mix.exs +++ b/mix.exs @@ -14,7 +14,7 @@ defmodule Zenohex.MixProject do start_permanent: Mix.env() == :prod, deps: deps(), # Docs - name: "ZenohEx", + name: "Zenohex", source_url: @source_url, docs: docs(), test_coverage: test_coverage(), From 75dd1ee9ae21243e2c99031b63bb32c1d8a8cee1 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 15:51:54 +0900 Subject: [PATCH 126/165] Bump version to v0.2.0-rc.2 --- mix.exs | 2 +- native/zenohex_nif/Cargo.lock | 2 +- native/zenohex_nif/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index 479df61..190ec10 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Zenohex.MixProject do use Mix.Project - @version "0.2.0-rc.1" + @version "0.2.0-rc.2" @source_url "https://github.com/b5g-ex/zenohex" def project do diff --git a/native/zenohex_nif/Cargo.lock b/native/zenohex_nif/Cargo.lock index ce6e395..c658e0f 100644 --- a/native/zenohex_nif/Cargo.lock +++ b/native/zenohex_nif/Cargo.lock @@ -3322,7 +3322,7 @@ dependencies = [ [[package]] name = "zenohex_nif" -version = "0.2.0-rc.1" +version = "0.2.0-rc.2" dependencies = [ "flume", "futures", diff --git a/native/zenohex_nif/Cargo.toml b/native/zenohex_nif/Cargo.toml index 7918c17..d444b93 100644 --- a/native/zenohex_nif/Cargo.toml +++ b/native/zenohex_nif/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zenohex_nif" -version = "0.2.0-rc.1" +version = "0.2.0-rc.2" authors = [] edition = "2021" From 188aca5e682b818a4b43a264d63daddd9d4a7aaf Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 16:09:32 +0900 Subject: [PATCH 127/165] Update chechsum-Elixir.Zenohex.Nif.exs --- checksum-Elixir.Zenohex.Nif.exs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/checksum-Elixir.Zenohex.Nif.exs b/checksum-Elixir.Zenohex.Nif.exs index aab9cbd..4388fef 100644 --- a/checksum-Elixir.Zenohex.Nif.exs +++ b/checksum-Elixir.Zenohex.Nif.exs @@ -1,11 +1,11 @@ %{ - "libzenohex_nif-v0.2.0-rc.1-nif-2.15-aarch64-apple-darwin.so.tar.gz" => "sha256:7877bc6913c252485ed10bbd6e4081b8f74be84dd8f251e3bf40b767871ea3da", - "libzenohex_nif-v0.2.0-rc.1-nif-2.15-aarch64-unknown-linux-gnu.so.tar.gz" => "sha256:9353f1943337976731ab1111f3df524510fc990217a39989714dc0b56a813880", - "libzenohex_nif-v0.2.0-rc.1-nif-2.15-aarch64-unknown-linux-musl.so.tar.gz" => "sha256:3ab203d686436f0d935907dd80fe035890c3f692fc94b1a8d03536d88f9a6f61", - "libzenohex_nif-v0.2.0-rc.1-nif-2.15-arm-unknown-linux-gnueabihf.so.tar.gz" => "sha256:b1406f2bc2cda6df768432c700d1bb571dd6ca2b85584af4cc88d17dd4cbaa96", - "libzenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-apple-darwin.so.tar.gz" => "sha256:4fdcaac50d65e6d069fde911b25e30c04aff4c8c8fd69917906a870db47814e3", - "libzenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-unknown-linux-gnu.so.tar.gz" => "sha256:32bc5b176bb81b384265f061e4953fd0b265dc6cc2219897962689059a1f8c6e", - "libzenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-unknown-linux-musl.so.tar.gz" => "sha256:0c306e0b3a4cb790a7f99037c2925ea76efebf254ab7d9a238820097c68b95ce", - "zenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-pc-windows-gnu.dll.tar.gz" => "sha256:32d156d75f8815338dfd0ff0664eef43030b5469c505fd741e14b1d2b9c14eca", - "zenohex_nif-v0.2.0-rc.1-nif-2.15-x86_64-pc-windows-msvc.dll.tar.gz" => "sha256:81c7fec9f38006f74843230ae82d9a6895912e7b1353261e06c781ea9f87174b", + "libzenohex_nif-v0.2.0-rc.2-nif-2.15-aarch64-apple-darwin.so.tar.gz" => "sha256:50123c9e497693e616daf10fcc3731329de3b2b25d7201bdfa06d4e1b430383e", + "libzenohex_nif-v0.2.0-rc.2-nif-2.15-aarch64-unknown-linux-gnu.so.tar.gz" => "sha256:d5fa11e706bdf974511c2a2ea4731e16460a272a5752ba9721201b3f6b435ae4", + "libzenohex_nif-v0.2.0-rc.2-nif-2.15-aarch64-unknown-linux-musl.so.tar.gz" => "sha256:4957bd71810dbff7d5685f3a6469cbf1adbe849e0e88c00607910441c701d0db", + "libzenohex_nif-v0.2.0-rc.2-nif-2.15-arm-unknown-linux-gnueabihf.so.tar.gz" => "sha256:db0dcbf78eea7fc7c8f9bfd6b9acd816da560c6ea345494195df8f9b967a2714", + "libzenohex_nif-v0.2.0-rc.2-nif-2.15-x86_64-apple-darwin.so.tar.gz" => "sha256:3413ab2f8f8772a690b59c43b6e5db5e3fcec721bc481ea14da20c890b22f561", + "libzenohex_nif-v0.2.0-rc.2-nif-2.15-x86_64-unknown-linux-gnu.so.tar.gz" => "sha256:c835b87013dc722c647851358deabd17abdc274c79b42fab617662ed06b8866c", + "libzenohex_nif-v0.2.0-rc.2-nif-2.15-x86_64-unknown-linux-musl.so.tar.gz" => "sha256:bc614603b0424618d5e18440cd9637b6deaf835d52f5523f936935b2f863a45f", + "zenohex_nif-v0.2.0-rc.2-nif-2.15-x86_64-pc-windows-gnu.dll.tar.gz" => "sha256:f4acdab20483a65e7e2f85aa139df5856e6ba1db7827e729af8b77fe46562779", + "zenohex_nif-v0.2.0-rc.2-nif-2.15-x86_64-pc-windows-msvc.dll.tar.gz" => "sha256:c9091043d80c1e6183002472cb2bc630767a783980665785836f8644921fae57", } From f39dd3f3e5ae590642490be6b8c485e459a8b337 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 12 Feb 2024 16:09:48 +0900 Subject: [PATCH 128/165] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 128875a..7186227 100644 --- a/README.md +++ b/README.md @@ -80,4 +80,11 @@ Use them as reference for your implementation. ### How to release -Follow [Recommended flow](https://hexdocs.pm/rustler_precompiled/precompilation_guide.html#recommended-flow). +1. Change versions, `mix.exs`, `native/zenohex_nif/Cargo.toml` +2. Run test, this step changes `native/zenohex_nif/Cargo.lock` version +3. Commit them and put the version tag, like v0.2.0 +4. Puth the tag, like `git push origin v0.2.0`. this step triggers the `.github/workflows/nif_precompile.yml` +5. After the artifacts are made, run `mix rustler_precompiled.download Zenohex.Nif --all` to update `checksum-Elixir.Zenohex.Nif.exs` and commit it. +6. Then publish to Hex + +(These steps just follows [Recommended flow](https://hexdocs.pm/rustler_precompiled/precompilation_guide.html#recommended-flow).) From 16fe61377b9476dcb9dec09d886ae610c90c83e9 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Tue, 13 Feb 2024 20:07:34 +0900 Subject: [PATCH 129/165] Remove `async: true` to avoid interference between tests that throw zenoh messages --- test/version_match_test.exs | 2 +- test/zenohex/config_test.exs | 2 +- test/zenohex/nif_test.exs | 2 +- test/zenohex/publisher_test.exs | 2 +- test/zenohex/pull_subscriber_test.exs | 2 +- test/zenohex/queryable_test.exs | 2 +- test/zenohex/session_test.exs | 2 +- test/zenohex/subscriber_test.exs | 2 +- test/zenohex_test.exs | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/version_match_test.exs b/test/version_match_test.exs index ada7744..9ef85ae 100644 --- a/test/version_match_test.exs +++ b/test/version_match_test.exs @@ -1,5 +1,5 @@ defmodule Zenohex.VersionMatchTest do - use ExUnit.Case, async: true + use ExUnit.Case describe "CI" do test "version match" do diff --git a/test/zenohex/config_test.exs b/test/zenohex/config_test.exs index 6f37fe1..0b1004c 100644 --- a/test/zenohex/config_test.exs +++ b/test/zenohex/config_test.exs @@ -1,5 +1,5 @@ defmodule Zenohex.ConfigTest do - use ExUnit.Case, async: true + use ExUnit.Case alias Zenohex.Config alias Zenohex.Config.Connect diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index f9e4712..0f39cce 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -1,5 +1,5 @@ defmodule Zenohex.NifTest do - use ExUnit.Case, async: true + use ExUnit.Case alias Zenohex.Nif alias Zenohex.Config diff --git a/test/zenohex/publisher_test.exs b/test/zenohex/publisher_test.exs index 87eee73..460cfd5 100644 --- a/test/zenohex/publisher_test.exs +++ b/test/zenohex/publisher_test.exs @@ -1,4 +1,4 @@ defmodule Zenohex.PublisherTest do - use ExUnit.Case, async: true + use ExUnit.Case doctest Zenohex.Publisher end diff --git a/test/zenohex/pull_subscriber_test.exs b/test/zenohex/pull_subscriber_test.exs index 8272d6b..8eb9c1d 100644 --- a/test/zenohex/pull_subscriber_test.exs +++ b/test/zenohex/pull_subscriber_test.exs @@ -1,4 +1,4 @@ defmodule Zenohex.PullSubscriberTest do - use ExUnit.Case, async: true + use ExUnit.Case doctest Zenohex.PullSubscriber end diff --git a/test/zenohex/queryable_test.exs b/test/zenohex/queryable_test.exs index d06eb19..dad7ca3 100644 --- a/test/zenohex/queryable_test.exs +++ b/test/zenohex/queryable_test.exs @@ -1,4 +1,4 @@ defmodule Zenohex.QueryableTest do - use ExUnit.Case, async: true + use ExUnit.Case doctest Zenohex.Queryable end diff --git a/test/zenohex/session_test.exs b/test/zenohex/session_test.exs index d00c612..33fecb6 100644 --- a/test/zenohex/session_test.exs +++ b/test/zenohex/session_test.exs @@ -1,4 +1,4 @@ defmodule Zenohex.SessionTest do - use ExUnit.Case, async: true + use ExUnit.Case doctest Zenohex.Session end diff --git a/test/zenohex/subscriber_test.exs b/test/zenohex/subscriber_test.exs index 4d055a8..0a73301 100644 --- a/test/zenohex/subscriber_test.exs +++ b/test/zenohex/subscriber_test.exs @@ -1,4 +1,4 @@ defmodule Zenohex.SubscriberTest do - use ExUnit.Case, async: true + use ExUnit.Case doctest Zenohex.Subscriber end diff --git a/test/zenohex_test.exs b/test/zenohex_test.exs index 1410320..9f1e7d1 100644 --- a/test/zenohex_test.exs +++ b/test/zenohex_test.exs @@ -1,5 +1,5 @@ defmodule ZenohexTest do - use ExUnit.Case, async: true + use ExUnit.Case doctest Zenohex alias Zenohex.Sample From f3446ce714989b4edab8fb4924bf2c6da9b84028 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 14 Feb 2024 06:12:55 +0900 Subject: [PATCH 130/165] Fix flaky Examples.SessionTest which depends on the network interface and its quality --- lib/zenohex/examples/session.ex | 4 ++++ lib/zenohex/examples/session/impl.ex | 8 ++++++++ test/zenohex/examples/session_test.exs | 22 +++++++++++++++------- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/zenohex/examples/session.ex b/lib/zenohex/examples/session.ex index 8b905ee..836dbdf 100644 --- a/lib/zenohex/examples/session.ex +++ b/lib/zenohex/examples/session.ex @@ -54,6 +54,10 @@ defmodule Zenohex.Examples.Session do Supervisor.start_link(__MODULE__, %{session: session}, name: __MODULE__) end + @doc "Get session." + @spec session() :: Zenohex.Session.t() + defdelegate session(), to: Session.Impl + @doc "Put data." @spec put(String.t(), integer() | float() | binary()) :: :ok defdelegate put(key_expr, value), to: Session.Impl diff --git a/lib/zenohex/examples/session/impl.ex b/lib/zenohex/examples/session/impl.ex index a78421d..60153bf 100644 --- a/lib/zenohex/examples/session/impl.ex +++ b/lib/zenohex/examples/session/impl.ex @@ -11,6 +11,10 @@ defmodule Zenohex.Examples.Session.Impl do GenServer.start_link(__MODULE__, args, name: __MODULE__) end + def session() do + GenServer.call(__MODULE__, :session) + end + def put(key_expr, value) do GenServer.call(__MODULE__, {:put, key_expr, value}) end @@ -38,6 +42,10 @@ defmodule Zenohex.Examples.Session.Impl do }} end + def handle_call(:session, _from, state) do + {:reply, state.session, state} + end + def handle_call({:put, key_expr, value}, _from, state) do ret = Session.put(state.session, key_expr, value) {:reply, ret, state} diff --git a/test/zenohex/examples/session_test.exs b/test/zenohex/examples/session_test.exs index 1d7bb9e..8c0e958 100644 --- a/test/zenohex/examples/session_test.exs +++ b/test/zenohex/examples/session_test.exs @@ -9,17 +9,25 @@ defmodule Zenohex.Examples.SessionTest do setup do start_supervised!({Session, %{}}) - :ok + + # NOTE: Use the same session for Subscriber or Queryable, to run unit tests even if you only have a loopback interface. + # + # - If you only have a loopback interface(lo), the test will always fail if you use different sessions. + # Because the peer cannot scout the another peer on lo. + # - Even if you have a network interface other than loopback, + # using different sessions may cause the test to fail depending on the scouting. + + %{session: Session.session()} end describe "put/2" do - test "with subscriber" do + test "with subscriber", %{session: session} do me = self() start_supervised!( {Subscriber, %{ - session: Zenohex.open!(), + session: session, key_expr: "key/expression/**", callback: fn sample -> send(me, sample) end }} @@ -31,13 +39,13 @@ defmodule Zenohex.Examples.SessionTest do end describe "delete/1" do - test "with subscriber" do + test "with subscriber", %{session: session} do me = self() start_supervised!( {Subscriber, %{ - session: Zenohex.open!(), + session: session, key_expr: "key/expression/**", callback: fn sample -> send(me, sample) end }} @@ -58,11 +66,11 @@ defmodule Zenohex.Examples.SessionTest do assert_receive :disconnected end - test "with queryable" do + test "with queryable", %{session: session} do start_supervised!( {Queryable, %{ - session: Zenohex.open!(), + session: session, key_expr: "key/expression/**", callback: fn query -> :ok = Query.reply(query, %Sample{key_expr: "key/expression/reply"}) From 5572390af4b487f111d33d64b328a8eff0884839 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 14 Feb 2024 06:13:20 +0900 Subject: [PATCH 131/165] Refactor Examples.Session.Impl --- lib/zenohex/examples/session/impl.ex | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/zenohex/examples/session/impl.ex b/lib/zenohex/examples/session/impl.ex index 60153bf..b472ebb 100644 --- a/lib/zenohex/examples/session/impl.ex +++ b/lib/zenohex/examples/session/impl.ex @@ -5,8 +5,6 @@ defmodule Zenohex.Examples.Session.Impl do require Logger - alias Zenohex.Session - def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end @@ -47,7 +45,7 @@ defmodule Zenohex.Examples.Session.Impl do end def handle_call({:put, key_expr, value}, _from, state) do - ret = Session.put(state.session, key_expr, value) + ret = Zenohex.Session.put(state.session, key_expr, value) {:reply, ret, state} end @@ -56,18 +54,18 @@ defmodule Zenohex.Examples.Session.Impl do end def handle_call({:delete, key_expr}, _from, state) do - :ok = Session.delete(state.session, key_expr) + :ok = Zenohex.Session.delete(state.session, key_expr) {:reply, :ok, state} end def handle_call({:get, selector, callback}, _from, state) do - {:ok, receiver} = Session.get_reply_receiver(state.session, selector) + {:ok, receiver} = Zenohex.Session.get_reply_receiver(state.session, selector) send(self(), :get_reply) {:reply, :ok, %{state | selector: selector, receiver: receiver, callback: callback}} end def handle_info(:get_reply, state) do - case Session.get_reply_timeout(state.receiver) do + case Zenohex.Session.get_reply_timeout(state.receiver) do {:ok, sample} -> state.callback.(sample) send(self(), :get_reply) From ef5d03a0b35e5372b71132ec9c996687bcbe4bbb Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 14 Feb 2024 06:16:51 +0900 Subject: [PATCH 132/165] Refactor Examples.(Subscriber|PullSubscriber|Queryable).Impl --- lib/zenohex/examples/pull_subscriber/impl.ex | 21 +++++++++----------- lib/zenohex/examples/queryable/impl.ex | 11 ++++------ lib/zenohex/examples/subscriber/impl.ex | 11 ++++------ 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/lib/zenohex/examples/pull_subscriber/impl.ex b/lib/zenohex/examples/pull_subscriber/impl.ex index a21dcf6..9bfec74 100644 --- a/lib/zenohex/examples/pull_subscriber/impl.ex +++ b/lib/zenohex/examples/pull_subscriber/impl.ex @@ -23,23 +23,13 @@ defmodule Zenohex.Examples.PullSubscriber.Impl do {:ok, pull_subscriber} = Session.declare_pull_subscriber(session, key_expr) state = %{pull_subscriber: pull_subscriber, callback: callback} - recv_timeout(state) + + send(self(), :loop) {:ok, state} end def handle_info(:loop, state) do - recv_timeout(state) - - {:noreply, state} - end - - def handle_call(:pull, _from, state) do - :ok = PullSubscriber.pull(state.pull_subscriber) - {:reply, :ok, state} - end - - defp recv_timeout(state) do case PullSubscriber.recv_timeout(state.pull_subscriber) do {:ok, sample} -> state.callback.(sample) @@ -51,5 +41,12 @@ defmodule Zenohex.Examples.PullSubscriber.Impl do {:error, error} -> Logger.error(inspect(error)) end + + {:noreply, state} + end + + def handle_call(:pull, _from, state) do + :ok = PullSubscriber.pull(state.pull_subscriber) + {:reply, :ok, state} end end diff --git a/lib/zenohex/examples/queryable/impl.ex b/lib/zenohex/examples/queryable/impl.ex index c411fb3..64eac7c 100644 --- a/lib/zenohex/examples/queryable/impl.ex +++ b/lib/zenohex/examples/queryable/impl.ex @@ -19,18 +19,13 @@ defmodule Zenohex.Examples.Queryable.Impl do {:ok, queryable} = Session.declare_queryable(session, key_expr) state = %{queryable: queryable, callback: callback} - recv_timeout(state) + + send(self(), :loop) {:ok, state} end def handle_info(:loop, state) do - recv_timeout(state) - - {:noreply, state} - end - - defp recv_timeout(state) do case Queryable.recv_timeout(state.queryable) do {:ok, query} -> state.callback.(query) @@ -42,5 +37,7 @@ defmodule Zenohex.Examples.Queryable.Impl do {:error, error} -> Logger.error(inspect(error)) end + + {:noreply, state} end end diff --git a/lib/zenohex/examples/subscriber/impl.ex b/lib/zenohex/examples/subscriber/impl.ex index e2cea0d..c7bab37 100644 --- a/lib/zenohex/examples/subscriber/impl.ex +++ b/lib/zenohex/examples/subscriber/impl.ex @@ -19,18 +19,13 @@ defmodule Zenohex.Examples.Subscriber.Impl do {:ok, subscriber} = Session.declare_subscriber(session, key_expr) state = %{subscriber: subscriber, callback: callback} - recv_timeout(state) + + send(self(), :loop) {:ok, state} end def handle_info(:loop, state) do - recv_timeout(state) - - {:noreply, state} - end - - defp recv_timeout(state) do case Subscriber.recv_timeout(state.subscriber) do {:ok, sample} -> state.callback.(sample) @@ -42,5 +37,7 @@ defmodule Zenohex.Examples.Subscriber.Impl do {:error, error} -> Logger.error(inspect(error)) end + + {:noreply, state} end end From 5514b4e3afdb797923fcb796d8d395353294444c Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 15 Feb 2024 13:50:36 +0900 Subject: [PATCH 133/165] Fix version, use 0.2.0-rc.2 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7186227..c7aa82c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ by adding `zenohex` to your list of dependencies in `mix.exs`: ```elixir def deps do [ - {:zenohex, "~> 0.2.0"} + {:zenohex, "~> 0.2.0-rc.2"} ] end ``` @@ -82,8 +82,8 @@ Use them as reference for your implementation. 1. Change versions, `mix.exs`, `native/zenohex_nif/Cargo.toml` 2. Run test, this step changes `native/zenohex_nif/Cargo.lock` version -3. Commit them and put the version tag, like v0.2.0 -4. Puth the tag, like `git push origin v0.2.0`. this step triggers the `.github/workflows/nif_precompile.yml` +3. Commit them and put the version tag, like v0.2.0-rc.2 +4. Puth the tag, like `git push origin v0.2.0-rc.2`. this step triggers the `.github/workflows/nif_precompile.yml` 5. After the artifacts are made, run `mix rustler_precompiled.download Zenohex.Nif --all` to update `checksum-Elixir.Zenohex.Nif.exs` and commit it. 6. Then publish to Hex From 3a4f6125ca1cdf223118ad4fdb3936140b0f8eac Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 15 Feb 2024 14:54:46 +0900 Subject: [PATCH 134/165] Fix Zenoh.open!() timing with short-circuit eval --- lib/zenohex/examples/publisher.ex | 2 +- lib/zenohex/examples/pull_subscriber.ex | 2 +- lib/zenohex/examples/queryable.ex | 2 +- lib/zenohex/examples/session.ex | 2 +- lib/zenohex/examples/storage.ex | 2 +- lib/zenohex/examples/subscriber.ex | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/zenohex/examples/publisher.ex b/lib/zenohex/examples/publisher.ex index 13beaea..4e93911 100644 --- a/lib/zenohex/examples/publisher.ex +++ b/lib/zenohex/examples/publisher.ex @@ -50,7 +50,7 @@ defmodule Zenohex.Examples.Publisher do Start Publisher. """ def start_link(args \\ %{}) when is_map(args) do - session = Map.get(args, :session, Zenohex.open!()) + session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/pub") Supervisor.start_link(__MODULE__, %{session: session, key_expr: key_expr}, name: __MODULE__) end diff --git a/lib/zenohex/examples/pull_subscriber.ex b/lib/zenohex/examples/pull_subscriber.ex index 54e94fe..65d7595 100644 --- a/lib/zenohex/examples/pull_subscriber.ex +++ b/lib/zenohex/examples/pull_subscriber.ex @@ -46,7 +46,7 @@ defmodule Zenohex.Examples.PullSubscriber do Start PullSubscriber. """ def start_link(args \\ %{}) when is_map(args) do - session = Map.get(args, :session, Zenohex.open!()) + session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/**") callback = Map.get(args, :callback, &Logger.debug(inspect(&1))) diff --git a/lib/zenohex/examples/queryable.ex b/lib/zenohex/examples/queryable.ex index 4f51922..51561cc 100644 --- a/lib/zenohex/examples/queryable.ex +++ b/lib/zenohex/examples/queryable.ex @@ -44,7 +44,7 @@ defmodule Zenohex.Examples.Queryable do Start Queryable. """ def start_link(args \\ %{}) when is_map(args) do - session = Map.get(args, :session, Zenohex.open!()) + session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/**") callback = Map.get(args, :callback, &Logger.debug(inspect(&1))) diff --git a/lib/zenohex/examples/session.ex b/lib/zenohex/examples/session.ex index 836dbdf..c5a1eee 100644 --- a/lib/zenohex/examples/session.ex +++ b/lib/zenohex/examples/session.ex @@ -50,7 +50,7 @@ defmodule Zenohex.Examples.Session do Start Session. """ def start_link(args \\ %{}) when is_map(args) do - session = Map.get(args, :session, Zenohex.open!()) + session = Map.get(args, :session) || Zenohex.open!() Supervisor.start_link(__MODULE__, %{session: session}, name: __MODULE__) end diff --git a/lib/zenohex/examples/storage.ex b/lib/zenohex/examples/storage.ex index f0d1948..19f3f4e 100644 --- a/lib/zenohex/examples/storage.ex +++ b/lib/zenohex/examples/storage.ex @@ -56,7 +56,7 @@ defmodule Zenohex.Examples.Storage do Start storage. """ def start_link(args \\ %{}) when is_map(args) do - session = Map.get(args, :session, Zenohex.open!()) + session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/**") Supervisor.start_link(__MODULE__, %{session: session, key_expr: key_expr}, name: __MODULE__) end diff --git a/lib/zenohex/examples/subscriber.ex b/lib/zenohex/examples/subscriber.ex index f0171ac..dac1232 100644 --- a/lib/zenohex/examples/subscriber.ex +++ b/lib/zenohex/examples/subscriber.ex @@ -44,7 +44,7 @@ defmodule Zenohex.Examples.Subscriber do Start Subscriber. """ def start_link(args \\ %{}) when is_map(args) do - session = Map.get(args, :session, Zenohex.open!()) + session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/**") callback = Map.get(args, :callback, &Logger.debug(inspect(&1))) From 6030e13233e44a72c29f8d919825e6e4bc6d8aa6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 15 Feb 2024 15:10:38 +0900 Subject: [PATCH 135/165] Remove useless code --- lib/zenohex/examples/session.ex | 4 ---- lib/zenohex/examples/session/impl.ex | 8 -------- 2 files changed, 12 deletions(-) diff --git a/lib/zenohex/examples/session.ex b/lib/zenohex/examples/session.ex index c5a1eee..c3d0574 100644 --- a/lib/zenohex/examples/session.ex +++ b/lib/zenohex/examples/session.ex @@ -54,10 +54,6 @@ defmodule Zenohex.Examples.Session do Supervisor.start_link(__MODULE__, %{session: session}, name: __MODULE__) end - @doc "Get session." - @spec session() :: Zenohex.Session.t() - defdelegate session(), to: Session.Impl - @doc "Put data." @spec put(String.t(), integer() | float() | binary()) :: :ok defdelegate put(key_expr, value), to: Session.Impl diff --git a/lib/zenohex/examples/session/impl.ex b/lib/zenohex/examples/session/impl.ex index b472ebb..5495bc5 100644 --- a/lib/zenohex/examples/session/impl.ex +++ b/lib/zenohex/examples/session/impl.ex @@ -9,10 +9,6 @@ defmodule Zenohex.Examples.Session.Impl do GenServer.start_link(__MODULE__, args, name: __MODULE__) end - def session() do - GenServer.call(__MODULE__, :session) - end - def put(key_expr, value) do GenServer.call(__MODULE__, {:put, key_expr, value}) end @@ -40,10 +36,6 @@ defmodule Zenohex.Examples.Session.Impl do }} end - def handle_call(:session, _from, state) do - {:reply, state.session, state} - end - def handle_call({:put, key_expr, value}, _from, state) do ret = Zenohex.Session.put(state.session, key_expr, value) {:reply, ret, state} From cb5566d19ad5d58ded203a189a986571b58463bd Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 15 Feb 2024 15:11:57 +0900 Subject: [PATCH 136/165] Modify Zenohex.open/1 --- lib/zenohex.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/zenohex.ex b/lib/zenohex.ex index eb92d5d..f9d3fc3 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -17,8 +17,8 @@ defmodule Zenohex do """ @spec open(Config.t()) :: {:ok, Session.t()} | {:error, reason :: any()} def open(config \\ %Config{}) do - if System.get_env("SCOUTING_DELAY") == "0" do - Nif.zenoh_open(%Config{scouting: %Scouting{delay: 0}}) + if delay = System.get_env("SCOUTING_DELAY") do + Nif.zenoh_open(%Config{scouting: %Scouting{delay: String.to_integer(delay)}}) else Nif.zenoh_open(config) end From fc3cf096a672afcb9b70ab2e4df8e7d373b855d6 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 15 Feb 2024 15:13:20 +0900 Subject: [PATCH 137/165] Change disable_zenoh_delay/1 on mix.exs --- mix.exs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 190ec10..723bdac 100644 --- a/mix.exs +++ b/mix.exs @@ -111,14 +111,13 @@ defmodule Zenohex.MixProject do """ ================================================================= HEY, ZENOHEX DEVELOPER. TO REDUCE TESTING TIME, - WE COMPILE WITH API_OPEN_SESSION_DELAY=0 AND SET SCOUTING DELAY 0 + WE COMPILE WITH API_OPEN_SESSION_DELAY=0 ================================================================= """ |> String.trim_trailing() |> Mix.shell().info() :ok = System.put_env("API_OPEN_SESSION_DELAY", "0") - :ok = System.put_env("SCOUTING_DELAY", "0") Mix.Task.run("compile", ["--force"]) end From 790f95232cb7e332cd5ed23ec3a8a686e3d416e4 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 15 Feb 2024 15:17:05 +0900 Subject: [PATCH 138/165] Use different sessions in Examples.SessionTest --- lib/zenohex/examples/queryable/impl.ex | 10 +++++++--- lib/zenohex/examples/subscriber/impl.ex | 9 ++++++--- test/zenohex/examples/session_test.exs | 15 ++++++--------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/zenohex/examples/queryable/impl.ex b/lib/zenohex/examples/queryable/impl.ex index 64eac7c..d1d2aeb 100644 --- a/lib/zenohex/examples/queryable/impl.ex +++ b/lib/zenohex/examples/queryable/impl.ex @@ -20,12 +20,18 @@ defmodule Zenohex.Examples.Queryable.Impl do {:ok, queryable} = Session.declare_queryable(session, key_expr) state = %{queryable: queryable, callback: callback} - send(self(), :loop) + recv_timeout(state) {:ok, state} end def handle_info(:loop, state) do + recv_timeout(state) + + {:noreply, state} + end + + def recv_timeout(state) do case Queryable.recv_timeout(state.queryable) do {:ok, query} -> state.callback.(query) @@ -37,7 +43,5 @@ defmodule Zenohex.Examples.Queryable.Impl do {:error, error} -> Logger.error(inspect(error)) end - - {:noreply, state} end end diff --git a/lib/zenohex/examples/subscriber/impl.ex b/lib/zenohex/examples/subscriber/impl.ex index c7bab37..66e0ea4 100644 --- a/lib/zenohex/examples/subscriber/impl.ex +++ b/lib/zenohex/examples/subscriber/impl.ex @@ -20,12 +20,17 @@ defmodule Zenohex.Examples.Subscriber.Impl do {:ok, subscriber} = Session.declare_subscriber(session, key_expr) state = %{subscriber: subscriber, callback: callback} - send(self(), :loop) + recv_timeout(state) {:ok, state} end def handle_info(:loop, state) do + recv_timeout(state) + {:noreply, state} + end + + defp recv_timeout(state) do case Subscriber.recv_timeout(state.subscriber) do {:ok, sample} -> state.callback.(sample) @@ -37,7 +42,5 @@ defmodule Zenohex.Examples.Subscriber.Impl do {:error, error} -> Logger.error(inspect(error)) end - - {:noreply, state} end end diff --git a/test/zenohex/examples/session_test.exs b/test/zenohex/examples/session_test.exs index 8c0e958..76acdcf 100644 --- a/test/zenohex/examples/session_test.exs +++ b/test/zenohex/examples/session_test.exs @@ -6,18 +6,15 @@ defmodule Zenohex.Examples.SessionTest do alias Zenohex.Examples.Queryable alias Zenohex.Query alias Zenohex.Sample + alias Zenohex.Config + alias Zenohex.Config.Scouting setup do - start_supervised!({Session, %{}}) + start_supervised!( + {Session, %{session: Zenohex.open!(%Config{scouting: %Scouting{delay: 0}})}} + ) - # NOTE: Use the same session for Subscriber or Queryable, to run unit tests even if you only have a loopback interface. - # - # - If you only have a loopback interface(lo), the test will always fail if you use different sessions. - # Because the peer cannot scout the another peer on lo. - # - Even if you have a network interface other than loopback, - # using different sessions may cause the test to fail depending on the scouting. - - %{session: Session.session()} + %{session: Zenohex.open!(%Config{scouting: %Scouting{delay: 30}})} end describe "put/2" do From efb214f89be73e32f8013d83a431836f59e4b064 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 08:58:41 +0900 Subject: [PATCH 139/165] Refactor trivial, remove alias and more --- lib/zenohex/examples/publisher/impl.ex | 13 ++++------ lib/zenohex/examples/pull_subscriber/impl.ex | 26 +++++++++---------- lib/zenohex/examples/queryable/impl.ex | 7 ++--- lib/zenohex/examples/storage/queryable.ex | 19 +++++--------- lib/zenohex/examples/storage/store.ex | 4 +-- .../examples/storage/store_behaviour.ex | 11 ++++---- lib/zenohex/examples/storage/subscriber.ex | 15 ++++------- lib/zenohex/examples/subscriber/impl.ex | 7 ++--- test/zenohex/examples/publisher_test.exs | 5 ++-- .../zenohex/examples/pull_subscriber_test.exs | 14 +++++----- test/zenohex/examples/queryable_test.exs | 6 ++--- test/zenohex/examples/session_test.exs | 12 ++++----- test/zenohex/examples/storage_test.exs | 11 ++++---- test/zenohex/examples/subscriber_test.exs | 6 ++--- 14 files changed, 63 insertions(+), 93 deletions(-) diff --git a/lib/zenohex/examples/publisher/impl.ex b/lib/zenohex/examples/publisher/impl.ex index f08efec..fee730e 100644 --- a/lib/zenohex/examples/publisher/impl.ex +++ b/lib/zenohex/examples/publisher/impl.ex @@ -3,9 +3,6 @@ defmodule Zenohex.Examples.Publisher.Impl do use GenServer - alias Zenohex.Session - alias Zenohex.Publisher - def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end @@ -29,27 +26,27 @@ defmodule Zenohex.Examples.Publisher.Impl do def init(args) do session = Map.fetch!(args, :session) key_expr = Map.fetch!(args, :key_expr) - {:ok, publisher} = Session.declare_publisher(session, key_expr) + {:ok, publisher} = Zenohex.Session.declare_publisher(session, key_expr) {:ok, %{publisher: publisher}} end def handle_call({:put, value}, _from, state) do - :ok = Publisher.put(state.publisher, value) + :ok = Zenohex.Publisher.put(state.publisher, value) {:reply, :ok, state} end def handle_call(:delete, _from, state) do - :ok = Publisher.delete(state.publisher) + :ok = Zenohex.Publisher.delete(state.publisher) {:reply, :ok, state} end def handle_call({:congestion_control, value}, _from, state) do - publisher = Publisher.congestion_control(state.publisher, value) + publisher = Zenohex.Publisher.congestion_control(state.publisher, value) {:reply, :ok, %{state | publisher: publisher}} end def handle_call({:priority, value}, _from, state) do - publisher = Publisher.priority(state.publisher, value) + publisher = Zenohex.Publisher.priority(state.publisher, value) {:reply, :ok, %{state | publisher: publisher}} end end diff --git a/lib/zenohex/examples/pull_subscriber/impl.ex b/lib/zenohex/examples/pull_subscriber/impl.ex index 9bfec74..29ee96b 100644 --- a/lib/zenohex/examples/pull_subscriber/impl.ex +++ b/lib/zenohex/examples/pull_subscriber/impl.ex @@ -5,9 +5,6 @@ defmodule Zenohex.Examples.PullSubscriber.Impl do require Logger - alias Zenohex.Session - alias Zenohex.PullSubscriber - def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end @@ -21,16 +18,26 @@ defmodule Zenohex.Examples.PullSubscriber.Impl do key_expr = Map.fetch!(args, :key_expr) callback = Map.fetch!(args, :callback) - {:ok, pull_subscriber} = Session.declare_pull_subscriber(session, key_expr) + {:ok, pull_subscriber} = Zenohex.Session.declare_pull_subscriber(session, key_expr) state = %{pull_subscriber: pull_subscriber, callback: callback} - send(self(), :loop) + recv_timeout(state) {:ok, state} end def handle_info(:loop, state) do - case PullSubscriber.recv_timeout(state.pull_subscriber) do + recv_timeout(state) + {:noreply, state} + end + + def handle_call(:pull, _from, state) do + :ok = Zenohex.PullSubscriber.pull(state.pull_subscriber) + {:reply, :ok, state} + end + + defp recv_timeout(state) do + case Zenohex.PullSubscriber.recv_timeout(state.pull_subscriber) do {:ok, sample} -> state.callback.(sample) send(self(), :loop) @@ -41,12 +48,5 @@ defmodule Zenohex.Examples.PullSubscriber.Impl do {:error, error} -> Logger.error(inspect(error)) end - - {:noreply, state} - end - - def handle_call(:pull, _from, state) do - :ok = PullSubscriber.pull(state.pull_subscriber) - {:reply, :ok, state} end end diff --git a/lib/zenohex/examples/queryable/impl.ex b/lib/zenohex/examples/queryable/impl.ex index d1d2aeb..10d600e 100644 --- a/lib/zenohex/examples/queryable/impl.ex +++ b/lib/zenohex/examples/queryable/impl.ex @@ -5,9 +5,6 @@ defmodule Zenohex.Examples.Queryable.Impl do require Logger - alias Zenohex.Session - alias Zenohex.Queryable - def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end @@ -17,7 +14,7 @@ defmodule Zenohex.Examples.Queryable.Impl do key_expr = Map.fetch!(args, :key_expr) callback = Map.fetch!(args, :callback) - {:ok, queryable} = Session.declare_queryable(session, key_expr) + {:ok, queryable} = Zenohex.Session.declare_queryable(session, key_expr) state = %{queryable: queryable, callback: callback} recv_timeout(state) @@ -32,7 +29,7 @@ defmodule Zenohex.Examples.Queryable.Impl do end def recv_timeout(state) do - case Queryable.recv_timeout(state.queryable) do + case Zenohex.Queryable.recv_timeout(state.queryable) do {:ok, query} -> state.callback.(query) send(self(), :loop) diff --git a/lib/zenohex/examples/storage/queryable.ex b/lib/zenohex/examples/storage/queryable.ex index 2e9d35e..88becf2 100644 --- a/lib/zenohex/examples/storage/queryable.ex +++ b/lib/zenohex/examples/storage/queryable.ex @@ -5,33 +5,28 @@ defmodule Zenohex.Examples.Storage.Queryable do require Logger - alias Zenohex.Session - alias Zenohex.Queryable - alias Zenohex.Examples.Storage.Store - alias Zenohex.Query - def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end def init(args) do - {:ok, queryable} = Session.declare_queryable(args.session, args.key_expr) + {:ok, queryable} = Zenohex.Session.declare_queryable(args.session, args.key_expr) send(self(), :loop) {:ok, %{queryable: queryable}} end def handle_info(:loop, state) do - case Queryable.recv_timeout(state.queryable) do + case Zenohex.Queryable.recv_timeout(state.queryable) do {:ok, query} -> case store(query) do {:error, :not_found} -> nil {:ok, samples} -> - Enum.each(samples, &Query.reply(query, &1)) - :ok = Query.finish_reply(query) + Enum.each(samples, &Zenohex.Query.reply(query, &1)) + :ok = Zenohex.Query.finish_reply(query) # following line is not needed, this is just example of double call - {:error, "ResponseFinal has already been sent"} = Query.finish_reply(query) + {:error, "ResponseFinal has already been sent"} = Zenohex.Query.finish_reply(query) end {:error, :timeout} -> @@ -45,7 +40,7 @@ defmodule Zenohex.Examples.Storage.Queryable do {:noreply, state} end - defp store(query) when is_struct(query, Query) do - Store.get(query.key_expr) + defp store(query) when is_struct(query, Zenohex.Query) do + Zenohex.Examples.Storage.Store.get(query.key_expr) end end diff --git a/lib/zenohex/examples/storage/store.ex b/lib/zenohex/examples/storage/store.ex index 9b6d939..5c20a18 100644 --- a/lib/zenohex/examples/storage/store.ex +++ b/lib/zenohex/examples/storage/store.ex @@ -7,8 +7,6 @@ defmodule Zenohex.Examples.Storage.Store do require Logger - alias Zenohex.KeyExpr - def start_link(initial_state) do Agent.start_link(fn -> initial_state end, name: __MODULE__) end @@ -49,7 +47,7 @@ defmodule Zenohex.Examples.Storage.Store do end defp find_keys(map, key_expr) do - Map.keys(map) |> Enum.filter(&KeyExpr.intersects?(&1, key_expr)) + Map.keys(map) |> Enum.filter(&Zenohex.KeyExpr.intersects?(&1, key_expr)) end defp collect_samples(map, key_expr) do diff --git a/lib/zenohex/examples/storage/store_behaviour.ex b/lib/zenohex/examples/storage/store_behaviour.ex index a92d769..f0675a5 100644 --- a/lib/zenohex/examples/storage/store_behaviour.ex +++ b/lib/zenohex/examples/storage/store_behaviour.ex @@ -1,9 +1,10 @@ defmodule Zenohex.Examples.Storage.StoreBehaviour do @moduledoc false - alias Zenohex.Sample - - @callback put(key_expr :: String.t(), sample :: Sample.t()) :: :ok | {:error, reason :: any()} - @callback delete(key_expr :: String.t()) :: :ok | {:error, reason :: any()} - @callback get(selector :: String.t()) :: {:ok, [Sample.t()]} | {:error, reason :: any()} + @callback put(key_expr :: String.t(), sample :: Zenohex.Sample.t()) :: + :ok | {:error, reason :: any()} + @callback delete(key_expr :: String.t()) :: + :ok | {:error, reason :: any()} + @callback get(selector :: String.t()) :: + {:ok, [Zenohex.Sample.t()]} | {:error, reason :: any()} end diff --git a/lib/zenohex/examples/storage/subscriber.ex b/lib/zenohex/examples/storage/subscriber.ex index 713cc48..68c7022 100644 --- a/lib/zenohex/examples/storage/subscriber.ex +++ b/lib/zenohex/examples/storage/subscriber.ex @@ -5,23 +5,18 @@ defmodule Zenohex.Examples.Storage.Subscriber do require Logger - alias Zenohex.Session - alias Zenohex.Subscriber - alias Zenohex.Sample - alias Zenohex.Examples.Storage.Store - def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end def init(args) do - {:ok, subscriber} = Session.declare_subscriber(args.session, args.key_expr) + {:ok, subscriber} = Zenohex.Session.declare_subscriber(args.session, args.key_expr) send(self(), :loop) {:ok, %{subscriber: subscriber}} end def handle_info(:loop, state) do - case Subscriber.recv_timeout(state.subscriber) do + case Zenohex.Subscriber.recv_timeout(state.subscriber) do {:ok, sample} -> store(sample) {:error, :timeout} -> nil {:error, reason} -> Logger.error(inspect(reason)) @@ -31,10 +26,10 @@ defmodule Zenohex.Examples.Storage.Subscriber do {:noreply, state} end - defp store(sample) when is_struct(sample, Sample) do + defp store(sample) when is_struct(sample, Zenohex.Sample) do case sample.kind do - :put -> Store.put(sample.key_expr, sample) - :delete -> Store.delete(sample.key_expr) + :put -> Zenohex.Examples.Storage.Store.put(sample.key_expr, sample) + :delete -> Zenohex.Examples.Storage.Store.delete(sample.key_expr) end end end diff --git a/lib/zenohex/examples/subscriber/impl.ex b/lib/zenohex/examples/subscriber/impl.ex index 66e0ea4..78c43fa 100644 --- a/lib/zenohex/examples/subscriber/impl.ex +++ b/lib/zenohex/examples/subscriber/impl.ex @@ -5,9 +5,6 @@ defmodule Zenohex.Examples.Subscriber.Impl do require Logger - alias Zenohex.Session - alias Zenohex.Subscriber - def start_link(args) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end @@ -17,7 +14,7 @@ defmodule Zenohex.Examples.Subscriber.Impl do key_expr = Map.fetch!(args, :key_expr) callback = Map.fetch!(args, :callback) - {:ok, subscriber} = Session.declare_subscriber(session, key_expr) + {:ok, subscriber} = Zenohex.Session.declare_subscriber(session, key_expr) state = %{subscriber: subscriber, callback: callback} recv_timeout(state) @@ -31,7 +28,7 @@ defmodule Zenohex.Examples.Subscriber.Impl do end defp recv_timeout(state) do - case Subscriber.recv_timeout(state.subscriber) do + case Zenohex.Subscriber.recv_timeout(state.subscriber) do {:ok, sample} -> state.callback.(sample) send(self(), :loop) diff --git a/test/zenohex/examples/publisher_test.exs b/test/zenohex/examples/publisher_test.exs index afc2ba0..ee33ab2 100644 --- a/test/zenohex/examples/publisher_test.exs +++ b/test/zenohex/examples/publisher_test.exs @@ -3,7 +3,6 @@ defmodule Zenohex.Examples.PublisherTest do alias Zenohex.Examples.Publisher alias Zenohex.Examples.Subscriber - alias Zenohex.Sample setup do {:ok, session} = Zenohex.open() @@ -28,7 +27,7 @@ defmodule Zenohex.Examples.PublisherTest do for i <- 0..100 do assert Publisher.put(i) == :ok - assert_receive %Sample{key_expr: "key/expression/pub", kind: :put, value: ^i} + assert_receive %Zenohex.Sample{key_expr: "key/expression/pub", kind: :put, value: ^i} end end end @@ -47,7 +46,7 @@ defmodule Zenohex.Examples.PublisherTest do ) assert Publisher.delete() == :ok - assert_receive %Sample{key_expr: "key/expression/pub", kind: :delete} + assert_receive %Zenohex.Sample{key_expr: "key/expression/pub", kind: :delete} end end diff --git a/test/zenohex/examples/pull_subscriber_test.exs b/test/zenohex/examples/pull_subscriber_test.exs index 9a72430..b3f168b 100644 --- a/test/zenohex/examples/pull_subscriber_test.exs +++ b/test/zenohex/examples/pull_subscriber_test.exs @@ -2,8 +2,6 @@ defmodule Zenohex.Examples.PullSubscriberTest do use ExUnit.Case alias Zenohex.Examples.PullSubscriber - alias Zenohex.Session - alias Zenohex.Sample test "start_link/1" do {:ok, session} = Zenohex.open() @@ -16,9 +14,9 @@ defmodule Zenohex.Examples.PullSubscriberTest do {PullSubscriber, %{session: session, key_expr: key_expr, callback: callback}} ) - Session.put(session, "key/expression/put", "put") + Zenohex.Session.put(session, "key/expression/put", "put") - assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) end test "pull/0" do @@ -32,11 +30,11 @@ defmodule Zenohex.Examples.PullSubscriberTest do {PullSubscriber, %{session: session, key_expr: key_expr, callback: callback}} ) - Session.put(session, "key/expression/put", "put") + Zenohex.Session.put(session, "key/expression/put", "put") - assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) - refute_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) + refute_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) PullSubscriber.pull() - assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) end end diff --git a/test/zenohex/examples/queryable_test.exs b/test/zenohex/examples/queryable_test.exs index 8bd72de..579c64e 100644 --- a/test/zenohex/examples/queryable_test.exs +++ b/test/zenohex/examples/queryable_test.exs @@ -4,8 +4,6 @@ defmodule Zenohex.Examples.QueryableTest do require Logger alias Zenohex.Examples.Queryable - alias Zenohex.Session - alias Zenohex.Query test "start_link/1" do {:ok, session} = Zenohex.open() @@ -16,8 +14,8 @@ defmodule Zenohex.Examples.QueryableTest do start_supervised!({Queryable, %{session: session, key_expr: key_expr, callback: callback}}) - Session.get_timeout(session, key_expr, 1000) + Zenohex.Session.get_timeout(session, key_expr, 1000) - assert_receive(%Query{}) + assert_receive(%Zenohex.Query{}) end end diff --git a/test/zenohex/examples/session_test.exs b/test/zenohex/examples/session_test.exs index 76acdcf..cd69b08 100644 --- a/test/zenohex/examples/session_test.exs +++ b/test/zenohex/examples/session_test.exs @@ -4,8 +4,6 @@ defmodule Zenohex.Examples.SessionTest do alias Zenohex.Examples.Session alias Zenohex.Examples.Subscriber alias Zenohex.Examples.Queryable - alias Zenohex.Query - alias Zenohex.Sample alias Zenohex.Config alias Zenohex.Config.Scouting @@ -31,7 +29,7 @@ defmodule Zenohex.Examples.SessionTest do ) assert Session.put("key/expression/put", "value") == :ok - assert_receive %Sample{key_expr: "key/expression/put", value: "value"} + assert_receive %Zenohex.Sample{key_expr: "key/expression/put", value: "value"} end end @@ -49,7 +47,7 @@ defmodule Zenohex.Examples.SessionTest do ) assert Session.delete("key/expression/delete") == :ok - assert_receive %Sample{key_expr: "key/expression/delete", kind: :delete} + assert_receive %Zenohex.Sample{key_expr: "key/expression/delete", kind: :delete} end end @@ -70,8 +68,8 @@ defmodule Zenohex.Examples.SessionTest do session: session, key_expr: "key/expression/**", callback: fn query -> - :ok = Query.reply(query, %Sample{key_expr: "key/expression/reply"}) - :ok = Query.finish_reply(query) + :ok = Zenohex.Query.reply(query, %Zenohex.Sample{key_expr: "key/expression/reply"}) + :ok = Zenohex.Query.finish_reply(query) end }} ) @@ -80,7 +78,7 @@ defmodule Zenohex.Examples.SessionTest do callback = fn sample -> send(me, sample) end assert Session.get("key/expression/**", callback) == :ok - assert_receive %Sample{} + assert_receive %Zenohex.Sample{} end end end diff --git a/test/zenohex/examples/storage_test.exs b/test/zenohex/examples/storage_test.exs index 602dbda..9ec7b5d 100644 --- a/test/zenohex/examples/storage_test.exs +++ b/test/zenohex/examples/storage_test.exs @@ -2,7 +2,6 @@ defmodule Zenohex.Examples.StorageTest do use ExUnit.Case alias Zenohex.Examples.Storage - alias Zenohex.Session setup do {:ok, session} = Zenohex.open() @@ -14,7 +13,7 @@ defmodule Zenohex.Examples.StorageTest do test "put", %{session: session} do key_expr = "demo/example/put" value = 0 - :ok = Session.put(session, key_expr, value) + :ok = Zenohex.Session.put(session, key_expr, value) confirm_put(key_expr, value) end @@ -22,17 +21,17 @@ defmodule Zenohex.Examples.StorageTest do test "delete", %{session: session} do key_expr = "demo/example/delete" value = 0 - :ok = Session.put(session, key_expr, value) + :ok = Zenohex.Session.put(session, key_expr, value) confirm_put(key_expr, value) - :ok = Session.delete(session, key_expr) + :ok = Zenohex.Session.delete(session, key_expr) confirm_delete(key_expr) end test "get", %{session: session} do key_expr = "demo/example/get" value = 0 - :ok = Session.put(session, key_expr, value) + :ok = Zenohex.Session.put(session, key_expr, value) confirm_put(key_expr, value) confirm_get(session, key_expr, value) @@ -61,7 +60,7 @@ defmodule Zenohex.Examples.StorageTest do end defp confirm_get(session, key_expr, value, retry_count \\ 10) when retry_count > 0 do - case Session.get_timeout(session, key_expr, 1000) do + case Zenohex.Session.get_timeout(session, key_expr, 1000) do {:ok, sample} -> assert sample.value == value diff --git a/test/zenohex/examples/subscriber_test.exs b/test/zenohex/examples/subscriber_test.exs index 131a60f..99791b9 100644 --- a/test/zenohex/examples/subscriber_test.exs +++ b/test/zenohex/examples/subscriber_test.exs @@ -2,8 +2,6 @@ defmodule Zenohex.Examples.SubscriberTest do use ExUnit.Case alias Zenohex.Examples.Subscriber - alias Zenohex.Session - alias Zenohex.Sample test "start_link/1" do {:ok, session} = Zenohex.open() @@ -14,8 +12,8 @@ defmodule Zenohex.Examples.SubscriberTest do start_supervised!({Subscriber, %{session: session, key_expr: key_expr, callback: callback}}) - Session.put(session, "key/expression/put", "put") + Zenohex.Session.put(session, "key/expression/put", "put") - assert_receive(%Sample{key_expr: "key/expression/put", value: "put"}) + assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) end end From 764878a84855814897033f4a3cf5a8104a320c80 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 10:46:41 +0900 Subject: [PATCH 140/165] Add session switch feature to examples/test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同じセッション、異なるセッションでのテストをできるようにした --- mix.exs | 4 ++++ test/support/utils.ex | 9 ++++++++ test/zenohex/examples/publisher_test.exs | 5 ++++- .../zenohex/examples/pull_subscriber_test.exs | 21 +++++++------------ test/zenohex/examples/queryable_test.exs | 11 ++++++---- test/zenohex/examples/session_test.exs | 12 +++++------ test/zenohex/examples/storage_test.exs | 5 ++++- test/zenohex/examples/subscriber_test.exs | 9 ++++++-- 8 files changed, 49 insertions(+), 27 deletions(-) create mode 100644 test/support/utils.ex diff --git a/mix.exs b/mix.exs index 723bdac..b6beb22 100644 --- a/mix.exs +++ b/mix.exs @@ -13,6 +13,7 @@ defmodule Zenohex.MixProject do package: package(), start_permanent: Mix.env() == :prod, deps: deps(), + elixirc_paths: elixirc_paths(Mix.env()), # Docs name: "Zenohex", source_url: @source_url, @@ -33,6 +34,9 @@ defmodule Zenohex.MixProject do ] end + defp elixirc_paths(:test), do: ["lib", "test/support"] + defp elixirc_paths(_), do: ["lib"] + # Run "mix help deps" to learn about dependencies. defp deps do [ diff --git a/test/support/utils.ex b/test/support/utils.ex new file mode 100644 index 0000000..98b3da6 --- /dev/null +++ b/test/support/utils.ex @@ -0,0 +1,9 @@ +defmodule Zenohex.Test.Utils do + def maybe_different_session(session) do + if is_nil(System.get_env("USE_DIFFERENT_SESSION")) do + session + else + Zenohex.open!() + end + end +end diff --git a/test/zenohex/examples/publisher_test.exs b/test/zenohex/examples/publisher_test.exs index ee33ab2..20fb39d 100644 --- a/test/zenohex/examples/publisher_test.exs +++ b/test/zenohex/examples/publisher_test.exs @@ -1,15 +1,18 @@ defmodule Zenohex.Examples.PublisherTest do use ExUnit.Case + import Zenohex.Test.Utils, only: [maybe_different_session: 1] + alias Zenohex.Examples.Publisher alias Zenohex.Examples.Subscriber setup do {:ok, session} = Zenohex.open() key_expr = "key/expression/pub" + start_supervised!({Publisher, %{session: session, key_expr: key_expr}}) - %{session: session} + %{session: maybe_different_session(session)} end describe "put/1" do diff --git a/test/zenohex/examples/pull_subscriber_test.exs b/test/zenohex/examples/pull_subscriber_test.exs index b3f168b..f998b22 100644 --- a/test/zenohex/examples/pull_subscriber_test.exs +++ b/test/zenohex/examples/pull_subscriber_test.exs @@ -1,12 +1,13 @@ defmodule Zenohex.Examples.PullSubscriberTest do use ExUnit.Case + import Zenohex.Test.Utils, only: [maybe_different_session: 1] + alias Zenohex.Examples.PullSubscriber - test "start_link/1" do + setup do {:ok, session} = Zenohex.open() key_expr = "key/expression/**" - me = self() callback = fn sample -> send(me, sample) end @@ -14,22 +15,16 @@ defmodule Zenohex.Examples.PullSubscriberTest do {PullSubscriber, %{session: session, key_expr: key_expr, callback: callback}} ) + %{session: maybe_different_session(session)} + end + + test "start_link/1", %{session: session} do Zenohex.Session.put(session, "key/expression/put", "put") assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) end - test "pull/0" do - {:ok, session} = Zenohex.open() - key_expr = "key/expression/**" - - me = self() - callback = fn sample -> send(me, sample) end - - start_supervised!( - {PullSubscriber, %{session: session, key_expr: key_expr, callback: callback}} - ) - + test "pull/0", %{session: session} do Zenohex.Session.put(session, "key/expression/put", "put") assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) diff --git a/test/zenohex/examples/queryable_test.exs b/test/zenohex/examples/queryable_test.exs index 579c64e..3125d2f 100644 --- a/test/zenohex/examples/queryable_test.exs +++ b/test/zenohex/examples/queryable_test.exs @@ -1,20 +1,23 @@ defmodule Zenohex.Examples.QueryableTest do use ExUnit.Case - require Logger + import Zenohex.Test.Utils, only: [maybe_different_session: 1] alias Zenohex.Examples.Queryable - test "start_link/1" do + setup do {:ok, session} = Zenohex.open() key_expr = "key/expression/**" - me = self() callback = fn query -> send(me, query) end start_supervised!({Queryable, %{session: session, key_expr: key_expr, callback: callback}}) - Zenohex.Session.get_timeout(session, key_expr, 1000) + %{session: maybe_different_session(session)} + end + + test "start_link/1", %{session: session} do + Zenohex.Session.get_timeout(session, "key/expression/**", 1000) assert_receive(%Zenohex.Query{}) end diff --git a/test/zenohex/examples/session_test.exs b/test/zenohex/examples/session_test.exs index cd69b08..6b6d185 100644 --- a/test/zenohex/examples/session_test.exs +++ b/test/zenohex/examples/session_test.exs @@ -1,18 +1,18 @@ defmodule Zenohex.Examples.SessionTest do use ExUnit.Case + import Zenohex.Test.Utils, only: [maybe_different_session: 1] + alias Zenohex.Examples.Session alias Zenohex.Examples.Subscriber alias Zenohex.Examples.Queryable - alias Zenohex.Config - alias Zenohex.Config.Scouting setup do - start_supervised!( - {Session, %{session: Zenohex.open!(%Config{scouting: %Scouting{delay: 0}})}} - ) + {:ok, session} = Zenohex.open() + + start_supervised!({Session, %{session: session}}) - %{session: Zenohex.open!(%Config{scouting: %Scouting{delay: 30}})} + %{session: maybe_different_session(session)} end describe "put/2" do diff --git a/test/zenohex/examples/storage_test.exs b/test/zenohex/examples/storage_test.exs index 9ec7b5d..e9edb68 100644 --- a/test/zenohex/examples/storage_test.exs +++ b/test/zenohex/examples/storage_test.exs @@ -1,13 +1,16 @@ defmodule Zenohex.Examples.StorageTest do use ExUnit.Case + import Zenohex.Test.Utils, only: [maybe_different_session: 1] + alias Zenohex.Examples.Storage setup do {:ok, session} = Zenohex.open() + start_supervised!({Storage, %{session: session, key_expr: "demo/example/**"}}) - %{session: session} + %{session: maybe_different_session(session)} end test "put", %{session: session} do diff --git a/test/zenohex/examples/subscriber_test.exs b/test/zenohex/examples/subscriber_test.exs index 99791b9..b755069 100644 --- a/test/zenohex/examples/subscriber_test.exs +++ b/test/zenohex/examples/subscriber_test.exs @@ -1,17 +1,22 @@ defmodule Zenohex.Examples.SubscriberTest do use ExUnit.Case + import Zenohex.Test.Utils, only: [maybe_different_session: 1] + alias Zenohex.Examples.Subscriber - test "start_link/1" do + setup do {:ok, session} = Zenohex.open() key_expr = "key/expression/**" - me = self() callback = fn sample -> send(me, sample) end start_supervised!({Subscriber, %{session: session, key_expr: key_expr, callback: callback}}) + %{session: maybe_different_session(session)} + end + + test "start_link/1", %{session: session} do Zenohex.Session.put(session, "key/expression/put", "put") assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) From 7fc6ad457b9350302fbadf1c060ea49609188a04 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 10:46:59 +0900 Subject: [PATCH 141/165] Fix trivial --- test/zenohex/config_test.exs | 2 +- test/zenohex/nif_test.exs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/test/zenohex/config_test.exs b/test/zenohex/config_test.exs index 0b1004c..b3a3864 100644 --- a/test/zenohex/config_test.exs +++ b/test/zenohex/config_test.exs @@ -5,7 +5,7 @@ defmodule Zenohex.ConfigTest do alias Zenohex.Config.Connect alias Zenohex.Config.Scouting - test "" do + test "Zenohex.open(config)" do config = %Config{ connect: %Connect{endpoints: ["tcp/localhost:7447"]}, scouting: %Scouting{delay: 200} diff --git a/test/zenohex/nif_test.exs b/test/zenohex/nif_test.exs index 0f39cce..d777428 100644 --- a/test/zenohex/nif_test.exs +++ b/test/zenohex/nif_test.exs @@ -2,12 +2,10 @@ defmodule Zenohex.NifTest do use ExUnit.Case alias Zenohex.Nif - alias Zenohex.Config - alias Zenohex.Config.Scouting alias Zenohex.Sample setup_all do - {:ok, session} = Nif.zenoh_open(%Config{scouting: %Scouting{delay: 0}}) + {:ok, session} = Nif.zenoh_open() %{session: session} end From 7264f6488edf0bfe115285706114d8d33c79a2b5 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 10:58:27 +0900 Subject: [PATCH 142/165] Fix tests that are caused by using different session --- test/zenohex/examples/publisher_test.exs | 10 +++++++++- test/zenohex/examples/pull_subscriber_test.exs | 7 +++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/test/zenohex/examples/publisher_test.exs b/test/zenohex/examples/publisher_test.exs index 20fb39d..9337b1e 100644 --- a/test/zenohex/examples/publisher_test.exs +++ b/test/zenohex/examples/publisher_test.exs @@ -49,7 +49,15 @@ defmodule Zenohex.Examples.PublisherTest do ) assert Publisher.delete() == :ok - assert_receive %Zenohex.Sample{key_expr: "key/expression/pub", kind: :delete} + + if System.get_env("USE_DIFFERENT_SESSION") do + # Zenoh 0.10.1-rc has the bug, https://github.com/eclipse-zenoh/zenoh/issues/633 + # This bug causes that `delete` creates the Sample whose kind is :put. + # FIXME: when update Zenoh from 0.10.1-rc to over + assert_receive %Zenohex.Sample{key_expr: "key/expression/pub", kind: :put} + else + assert_receive %Zenohex.Sample{key_expr: "key/expression/pub", kind: :delete} + end end end diff --git a/test/zenohex/examples/pull_subscriber_test.exs b/test/zenohex/examples/pull_subscriber_test.exs index f998b22..8b2d7a0 100644 --- a/test/zenohex/examples/pull_subscriber_test.exs +++ b/test/zenohex/examples/pull_subscriber_test.exs @@ -18,6 +18,11 @@ defmodule Zenohex.Examples.PullSubscriberTest do %{session: maybe_different_session(session)} end + # WHY: skip this test when using different session + # When using same session, Zenoh pull subscriber can get Sample before pulling. + # But using different session, Zenoh pull subscriber can not. + # This might be a Zenoh bug. + @tag System.get_env("USE_DIFFERENT_SESSION") && :skip test "start_link/1", %{session: session} do Zenohex.Session.put(session, "key/expression/put", "put") @@ -27,8 +32,6 @@ defmodule Zenohex.Examples.PullSubscriberTest do test "pull/0", %{session: session} do Zenohex.Session.put(session, "key/expression/put", "put") - assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) - refute_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) PullSubscriber.pull() assert_receive(%Zenohex.Sample{key_expr: "key/expression/put", value: "put"}) end From c55b0455c84525f5abeee62d75402eb099c74712 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 11:05:56 +0900 Subject: [PATCH 143/165] Modify reducing test time suggest --- mix.exs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/mix.exs b/mix.exs index b6beb22..62ff723 100644 --- a/mix.exs +++ b/mix.exs @@ -21,8 +21,8 @@ defmodule Zenohex.MixProject do test_coverage: test_coverage(), dialyzer: dialyzer(), aliases: [ - {:test, [&disable_zenoh_delay/1, "test"]}, - {:"test.watch", [&disable_zenoh_delay/1, "test.watch"]} + {:test, [&suggest/1, "test"]}, + {:"test.watch", [&suggest/1, "test.watch"]} ] ] end @@ -110,19 +110,29 @@ defmodule Zenohex.MixProject do ] end - defp disable_zenoh_delay(_args) do - :ok = + defp suggest(_args) do + if is_nil(System.get_env("API_OPEN_SESSION_DELAY")) do """ - ================================================================= - HEY, ZENOHEX DEVELOPER. TO REDUCE TESTING TIME, - WE COMPILE WITH API_OPEN_SESSION_DELAY=0 - ================================================================= + ==================================================================== + HEY, ZENOHEX DEVELOPER. IF YOU WANNA REDUCE TEST TIME, DO FOLLOWINGS + export API_OPEN_SESSION_DELAY=0 && mix compile --force + AND YOU CAN ALSO ADJUST SCOUTING TIME, DO FOLLOWINGS + ==================================================================== """ |> String.trim_trailing() |> Mix.shell().info() + end - :ok = System.put_env("API_OPEN_SESSION_DELAY", "0") - - Mix.Task.run("compile", ["--force"]) + if is_nil(System.get_env("SCOUTING_DELAY")) do + """ + ==================================================================== + HEY, ZENOHEX DEVELOPER. IF YOU WANNA REDUCE TEST TIME, + YOU CAN ADJUST SCOUTING DELAY, LIKE FOLLOWINGS + SCOUTING_DELAY=30 mix test + ==================================================================== + """ + |> String.trim_trailing() + |> Mix.shell().info() + end end end From a480ed8839d7ebc5b083181961affc7c7595903a Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 11:06:59 +0900 Subject: [PATCH 144/165] Modify Zenohex.open/1 --- lib/zenohex.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/zenohex.ex b/lib/zenohex.ex index f9d3fc3..0426996 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -17,10 +17,10 @@ defmodule Zenohex do """ @spec open(Config.t()) :: {:ok, Session.t()} | {:error, reason :: any()} def open(config \\ %Config{}) do - if delay = System.get_env("SCOUTING_DELAY") do - Nif.zenoh_open(%Config{scouting: %Scouting{delay: String.to_integer(delay)}}) - else + if is_nil(delay = System.get_env("SCOUTING_DELAY")) do Nif.zenoh_open(config) + else + Nif.zenoh_open(%Config{config | scouting: %Scouting{delay: String.to_integer(delay)}}) end end From 57b77d9f895a8e7b36f9509e1401b51248d5b7e3 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 11:11:09 +0900 Subject: [PATCH 145/165] Update .github/workflows/ci.yaml to test both using same/different sessions --- .github/workflows/ci.yaml | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index dfa9b6f..10070d7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -96,7 +96,7 @@ jobs: - name: dialyzer run: mix dialyzer --format github - test: + test-with-one-session: needs: build-deps runs-on: ubuntu-latest @@ -120,3 +120,28 @@ jobs: - name: test run: mix test --warnings-as-errors --cover + + test-with-two-session: + needs: build-deps + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: erlef/setup-beam@v1 + id: setup-beam + with: + otp-version: ${{env.OTP_VERSION}} + elixir-version: ${{env.ELIXIR_VERSION}} + + - uses: actions/cache/restore@v4 + id: restore-deps-cache + with: + path: | + deps + _build + key: deps-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ hashFiles('**/*.lock') }} + restore-keys: deps-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}- + + - name: test + run: USE_DIFFERENT_SESSION="" mix test --warnings-as-errors --cover From 838346819d80571838d1ee20930e99e3e201a5d1 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 11:32:21 +0900 Subject: [PATCH 146/165] Update .github/workflows/ci.yaml to run CI when push to main and any PR --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 10070d7..0d9951f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -9,8 +9,8 @@ env: on: push: - branches: - - "pojiro/0.2.0-dev" + branches: main + pull_request: jobs: build-deps: From fad94310e50ce76c59abfa00a63e3caf7eada895 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 11:38:42 +0900 Subject: [PATCH 147/165] Fix credo issues --- .github/workflows/ci.yaml | 2 +- lib/zenohex.ex | 10 ++++++---- test/support/utils.ex | 2 ++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0d9951f..49820f7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -71,7 +71,7 @@ jobs: run: cargo fmt --all -- --check - name: credo - run: mix credo --all + run: mix credo --ignore fixme - name: restore plts cache id: restore-plts-cache diff --git a/lib/zenohex.ex b/lib/zenohex.ex index 0426996..a292c27 100644 --- a/lib/zenohex.ex +++ b/lib/zenohex.ex @@ -17,10 +17,12 @@ defmodule Zenohex do """ @spec open(Config.t()) :: {:ok, Session.t()} | {:error, reason :: any()} def open(config \\ %Config{}) do - if is_nil(delay = System.get_env("SCOUTING_DELAY")) do - Nif.zenoh_open(config) - else - Nif.zenoh_open(%Config{config | scouting: %Scouting{delay: String.to_integer(delay)}}) + case System.get_env("SCOUTING_DELAY") do + nil -> + Nif.zenoh_open(config) + + delay -> + Nif.zenoh_open(%Config{config | scouting: %Scouting{delay: String.to_integer(delay)}}) end end diff --git a/test/support/utils.ex b/test/support/utils.ex index 98b3da6..092f70b 100644 --- a/test/support/utils.ex +++ b/test/support/utils.ex @@ -1,4 +1,6 @@ defmodule Zenohex.Test.Utils do + @moduledoc false + def maybe_different_session(session) do if is_nil(System.get_env("USE_DIFFERENT_SESSION")) do session From e743a2be42625be1ea8ea5103bd406a09c8b6777 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 13:48:35 +0900 Subject: [PATCH 148/165] Fix trivial --- mix.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/mix.exs b/mix.exs index 62ff723..d0e5ece 100644 --- a/mix.exs +++ b/mix.exs @@ -116,7 +116,6 @@ defmodule Zenohex.MixProject do ==================================================================== HEY, ZENOHEX DEVELOPER. IF YOU WANNA REDUCE TEST TIME, DO FOLLOWINGS export API_OPEN_SESSION_DELAY=0 && mix compile --force - AND YOU CAN ALSO ADJUST SCOUTING TIME, DO FOLLOWINGS ==================================================================== """ |> String.trim_trailing() From 1ef100fba87b8654447f9a31182c34daee614e59 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 15 Feb 2024 15:41:47 +0900 Subject: [PATCH 149/165] Update .github/workflows/nif_precompile.yml, update OS versions --- .github/workflows/nif_precompile.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/nif_precompile.yml b/.github/workflows/nif_precompile.yml index ed9746f..c0f6504 100644 --- a/.github/workflows/nif_precompile.yml +++ b/.github/workflows/nif_precompile.yml @@ -14,15 +14,15 @@ jobs: matrix: nif: ["2.15"] job: - - { target: aarch64-apple-darwin , os: macos-11 } - - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04 , use-cross: true } - - { target: aarch64-unknown-linux-musl , os: ubuntu-20.04 , use-cross: true } - - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04 , use-cross: true } - - { target: x86_64-apple-darwin , os: macos-11 } - - { target: x86_64-pc-windows-gnu , os: windows-2019 } - - { target: x86_64-pc-windows-msvc , os: windows-2019 } - - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 } - - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04 , use-cross: true } + - { target: aarch64-apple-darwin , os: macos-12 } + - { target: aarch64-unknown-linux-gnu , os: ubuntu-22.04 , use-cross: true } + - { target: aarch64-unknown-linux-musl , os: ubuntu-22.04 , use-cross: true } + - { target: arm-unknown-linux-gnueabihf , os: ubuntu-22.04 , use-cross: true } + - { target: x86_64-apple-darwin , os: macos-12 } + - { target: x86_64-pc-windows-gnu , os: windows-2022 } + - { target: x86_64-pc-windows-msvc , os: windows-2022 } + - { target: x86_64-unknown-linux-gnu , os: ubuntu-22.04 } + - { target: x86_64-unknown-linux-musl , os: ubuntu-22.04 , use-cross: true } steps: - name: Checkout source code From 8f531fadb5d18dcfcca608adbade958a5e73109a Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 14 Feb 2024 18:24:40 +0900 Subject: [PATCH 150/165] Add .github/dependabot.yml --- .github/dependabot.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..00f3324 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + - package-ecosystem: "mix" + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 From 5d1ea8e4dfddedee128f070865f9556d5e84d1ee Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Wed, 14 Feb 2024 18:25:32 +0900 Subject: [PATCH 151/165] Update rustler from 0.30.0 to 0.31.0 --- lib/zenohex/nif.ex | 2 -- mix.exs | 2 +- mix.lock | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/zenohex/nif.ex b/lib/zenohex/nif.ex index ba1312a..de85950 100644 --- a/lib/zenohex/nif.ex +++ b/lib/zenohex/nif.ex @@ -16,8 +16,6 @@ defmodule Zenohex.Nif do # for Nerves @compile {:autoload, false} - # suppress dialyzer error, remove this when https://github.com/rusterlium/rustler/pull/570 is released - @dialyzer :no_match alias Zenohex.Publisher alias Zenohex.Subscriber diff --git a/mix.exs b/mix.exs index d0e5ece..92eb3b5 100644 --- a/mix.exs +++ b/mix.exs @@ -41,7 +41,7 @@ defmodule Zenohex.MixProject do defp deps do [ {:rustler_precompiled, "~> 0.7.1"}, - {:rustler, ">= 0.30.0", optional: true}, + {:rustler, ">= 0.31.0", optional: true}, {:ex_doc, "~> 0.31.0", only: :dev}, {:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, diff --git a/mix.lock b/mix.lock index f5a7a78..2fdc411 100644 --- a/mix.lock +++ b/mix.lock @@ -13,7 +13,7 @@ "makeup_erlang": {:hex, :makeup_erlang, "0.1.3", "d684f4bac8690e70b06eb52dad65d26de2eefa44cd19d64a8095e1417df7c8fd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b78dc853d2e670ff6390b605d807263bf606da3c82be37f9d7f68635bd886fc9"}, "mix_test_watch": {:hex, :mix_test_watch, "1.1.1", "eee6fc570d77ad6851c7bc08de420a47fd1e449ef5ccfa6a77ef68b72e7e51ad", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "f82262b54dee533467021723892e15c3267349849f1f737526523ecba4e6baae"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, - "rustler": {:hex, :rustler, "0.30.0", "cefc49922132b072853fa9b0ca4dc2ffcb452f68fb73b779042b02d545e097fb", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:toml, "~> 0.6", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "9ef1abb6a7dda35c47cfc649e6a5a61663af6cf842a55814a554a84607dee389"}, + "rustler": {:hex, :rustler, "0.31.0", "7e5eefe61e6e6f8901e5aa3de60073d360c6320d9ec363027b0197297b80c46a", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:toml, "~> 0.6", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "99e378459bfb9c3bda6d3548b2b3bc6f9ad97f728f76bdbae7bf5c770a4f8abd"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.7.1", "ecadf02cc59a0eccbaed6c1937303a5827fbcf60010c541595e6d3747d3d0f9f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "b9e4657b99a1483ea31502e1d58c464bedebe9028808eda45c3a429af4550c66"}, "toml": {:hex, :toml, "0.7.0", "fbcd773caa937d0c7a02c301a1feea25612720ac3fa1ccb8bfd9d30d822911de", [:mix], [], "hexpm", "0690246a2478c1defd100b0c9b89b4ea280a22be9a7b313a8a058a2408a2fa70"}, } From 8347c9978ddbd18ea96a1f1a6db9757c6080cf70 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 14:58:41 +0900 Subject: [PATCH 152/165] Fix USE_DIFFERENT_SESSION use --- .github/workflows/ci.yaml | 4 ++-- test/support/utils.ex | 6 +++--- test/zenohex/examples/publisher_test.exs | 2 +- test/zenohex/examples/pull_subscriber_test.exs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 49820f7..3272b5e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -121,7 +121,7 @@ jobs: - name: test run: mix test --warnings-as-errors --cover - test-with-two-session: + test-with-another-session: needs: build-deps runs-on: ubuntu-latest @@ -144,4 +144,4 @@ jobs: restore-keys: deps-${{ runner.os }}-${{ steps.setup-beam.outputs.otp-version }}-${{ steps.setup-beam.outputs.elixir-version }}- - name: test - run: USE_DIFFERENT_SESSION="" mix test --warnings-as-errors --cover + run: USE_DIFFERENT_SESSION="1" mix test --warnings-as-errors --cover diff --git a/test/support/utils.ex b/test/support/utils.ex index 092f70b..02535f8 100644 --- a/test/support/utils.ex +++ b/test/support/utils.ex @@ -2,10 +2,10 @@ defmodule Zenohex.Test.Utils do @moduledoc false def maybe_different_session(session) do - if is_nil(System.get_env("USE_DIFFERENT_SESSION")) do - session - else + if System.get_env("USE_DIFFERENT_SESSION") == "1" do Zenohex.open!() + else + session end end end diff --git a/test/zenohex/examples/publisher_test.exs b/test/zenohex/examples/publisher_test.exs index 9337b1e..aaa1c72 100644 --- a/test/zenohex/examples/publisher_test.exs +++ b/test/zenohex/examples/publisher_test.exs @@ -50,7 +50,7 @@ defmodule Zenohex.Examples.PublisherTest do assert Publisher.delete() == :ok - if System.get_env("USE_DIFFERENT_SESSION") do + if System.get_env("USE_DIFFERENT_SESSION") == "1" do # Zenoh 0.10.1-rc has the bug, https://github.com/eclipse-zenoh/zenoh/issues/633 # This bug causes that `delete` creates the Sample whose kind is :put. # FIXME: when update Zenoh from 0.10.1-rc to over diff --git a/test/zenohex/examples/pull_subscriber_test.exs b/test/zenohex/examples/pull_subscriber_test.exs index 8b2d7a0..0d2a33f 100644 --- a/test/zenohex/examples/pull_subscriber_test.exs +++ b/test/zenohex/examples/pull_subscriber_test.exs @@ -22,7 +22,7 @@ defmodule Zenohex.Examples.PullSubscriberTest do # When using same session, Zenoh pull subscriber can get Sample before pulling. # But using different session, Zenoh pull subscriber can not. # This might be a Zenoh bug. - @tag System.get_env("USE_DIFFERENT_SESSION") && :skip + @tag System.get_env("USE_DIFFERENT_SESSION") == "1" && :skip test "start_link/1", %{session: session} do Zenohex.Session.put(session, "key/expression/put", "put") From 7f8d80954d83d5873a0147a866e77dbeaaf6afef Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 14:33:41 +0900 Subject: [PATCH 153/165] Move Examples.Publisher doc to lib/zenohex/examples/README.md --- lib/zenohex/examples/README.md | 65 +++++++++++++++++++++++++++++++ lib/zenohex/examples/publisher.ex | 47 +--------------------- mix.exs | 1 - 3 files changed, 67 insertions(+), 46 deletions(-) create mode 100644 lib/zenohex/examples/README.md diff --git a/lib/zenohex/examples/README.md b/lib/zenohex/examples/README.md new file mode 100644 index 0000000..9e5098e --- /dev/null +++ b/lib/zenohex/examples/README.md @@ -0,0 +1,65 @@ +# Zenohex.Examples + +This README shows how to use following each example implementations. + +- [Zenohex.Examples.Publisher](#publisher) +- [Zenohex.Examples.Subscriber](#subscriber) +- [Zenohex.Examples.PullSubscriber](#pullsubscriber) +- [Zenohex.Examples.Queryable](#queryable) +- [Zenohex.Examples.Session](#session) +- [Zenohex.Examples.Storage](#storage) + +## Publisher + +This Publisher is made of `Supervisor` and `GenServer`. +If you would like to see the codes, check the followings. + +- Supervisor + - [/lib/zenohex/examples/publisher.ex](/lib/zenohex/examples/publisher.ex) +- GenServer + - [/lib/zenohex/examples/publisher/impl.ex](/lib/zenohex/examples/publisher/impl.ex) + +### Start Publisher + +```elixir +iex> alias Zenohex.Examples.Publisher +# if not specify session and key_expr, they are made internally. key_expr is "zenohex/examples/pub" +iex> Publisher.start_link() +# you can also inject your session and key_expr from outside +iex> Publisher.start_link(%{session: your_session, key_expr: "your_key/expression"}) +``` + +### Put data + +```elixir +iex> Publisher.put(42) # integer +iex> Publisher.put(42.42) # float +iex> Publisher.put("42") # binary +``` + +### Delete data + +```elixir +iex> Publisher.delete() +``` + +see. [#16](https://github.com/b5g-ex/zenohex/issues/16) + +### Change Publisher options + +```elixir +iex> Publisher.congestion_control(:block) +iex> Publisher.priority(:real_time) +``` + +see. Supported options, [Zenohex.Publisher.Options](/lib/zenohex/publisher.ex) + +### Subscriber + +### PullSubscriber + +### Queryable + +### Session + +### Storage diff --git a/lib/zenohex/examples/publisher.ex b/lib/zenohex/examples/publisher.ex index 4e93911..d2bf1e7 100644 --- a/lib/zenohex/examples/publisher.ex +++ b/lib/zenohex/examples/publisher.ex @@ -1,54 +1,11 @@ defmodule Zenohex.Examples.Publisher do - mix_config = Mix.Project.config() - version = mix_config[:version] - base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" - - @moduledoc """ - This is the example Publisher implementation using Zenohex. - - This Publisher is made of `m:Supervisor` and `m:GenServer`. - If you would like to see the codes, check the followings. - - * Supervisor - * [lib/zenohex/examples/publisher.ex](#{base_url}/publisher.ex) - * GenServer - * [lib/zenohex/examples/publisher/impl.ex](#{base_url}/publisher/impl.ex) - - ## Getting Started - - ### Start Publisher - - iex> alias Zenohex.Examples.Publisher - # if not specify session and key_expr, they are made internally. key_expr is "zenohex/examples/pub" - iex> Publisher.start_link() - # you can also inject your session and key_expr from outside - iex> Publisher.start_link(%{session: your_session, key_expr: "your_key/expression"}) - - ### Put data - - iex> Publisher.put(42) # integer - iex> Publisher.put(42.42) # float - iex> Publisher.put("42") # binary - - ### Delete data - - iex> Publisher.delete() - - ### Change Publisher options - - iex> Publisher.congestion_control(:block) - iex> Publisher.priority(:real_time) - - see. Supported options, `m:Zenohex.Publisher.Options` - """ + @moduledoc false use Supervisor alias Zenohex.Examples.Publisher - @doc """ - Start Publisher. - """ + @doc "Start Publisher." def start_link(args \\ %{}) when is_map(args) do session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/pub") diff --git a/mix.exs b/mix.exs index 92eb3b5..f4e9363 100644 --- a/mix.exs +++ b/mix.exs @@ -86,7 +86,6 @@ defmodule Zenohex.MixProject do Zenohex.Subscriber.Options ], Examples: [ - Zenohex.Examples.Publisher, Zenohex.Examples.Subscriber, Zenohex.Examples.PullSubscriber, Zenohex.Examples.Session, From d91c346c17699193b4c203b3d877f6a44e44a007 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 15:06:53 +0900 Subject: [PATCH 154/165] Move Examples.Subscriber doc to lib/zenohex/examples/README.md --- lib/zenohex/examples/README.md | 31 +++++++++++++++++++++++- lib/zenohex/examples/subscriber.ex | 39 ++---------------------------- mix.exs | 1 - 3 files changed, 32 insertions(+), 39 deletions(-) diff --git a/lib/zenohex/examples/README.md b/lib/zenohex/examples/README.md index 9e5098e..04d79d9 100644 --- a/lib/zenohex/examples/README.md +++ b/lib/zenohex/examples/README.md @@ -54,7 +54,36 @@ iex> Publisher.priority(:real_time) see. Supported options, [Zenohex.Publisher.Options](/lib/zenohex/publisher.ex) -### Subscriber +## Subscriber + +This Subscriber is made of `Supervisor` and `GenServer`. +If you would like to see the codes, check the followings. + +- Supervisor + - [lib/zenohex/examples/subscriber.ex](/lib/zenohex/examples/subscriber.ex) +- GenServer + - [lib/zenohex/examples/subscriber/impl.ex](/lib/zenohex/examples/subscriber/impl.ex) + +### Start Subscriber + +```elixir +iex> alias Zenohex.Examples.Subscriber +# if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**",callback is &Logger.debug(inspect(&1)) +iex> Subscriber.start_link() +# you can also inject your session, key_expr and callback from outside +iex> Subscriber.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) +``` + +### Subscribed? + +```elixir +iex> alias Zenohex.Examples.Publisher +iex> Publisher.start_link() +iex> Publisher.put("subscribed?") +:ok + +11:51:53.959 [debug] %Zenohex.Sample{key_expr: "zenohex/examples/pub", value: "subscribed?", kind: :put, reference: #Reference<0.1373489635.746717252.118288>} +``` ### PullSubscriber diff --git a/lib/zenohex/examples/subscriber.ex b/lib/zenohex/examples/subscriber.ex index dac1232..3b19eac 100644 --- a/lib/zenohex/examples/subscriber.ex +++ b/lib/zenohex/examples/subscriber.ex @@ -1,38 +1,5 @@ defmodule Zenohex.Examples.Subscriber do - mix_config = Mix.Project.config() - version = mix_config[:version] - base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" - - @moduledoc """ - This is the example Subscriber implementation using Zenohex. - - This Subscriber is made of `m:Supervisor` and `m:GenServer`. - If you would like to see the codes, check the followings. - - * Supervisor - * [lib/zenohex/examples/subscriber.ex](#{base_url}/subscriber.ex) - * GenServer - * [lib/zenohex/examples/subscriber/impl.ex](#{base_url}/subscriber/impl.ex) - - ## Getting Started - - ### Start Subscriber - - iex> alias Zenohex.Examples.Subscriber - # if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**",callback is &Logger.debug(inspect(&1)) - iex> Subscriber.start_link() - # you can also inject your session, key_expr and callback from outside - iex> Subscriber.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) - - ### Subscribed? - - iex> alias Zenohex.Examples.Publisher - iex> Publisher.start_link() - iex> Publisher.put("subscribed?") - :ok - - 11:51:53.959 [debug] %Zenohex.Sample{key_expr: "zenohex/examples/pub", value: "subscribed?", kind: :put, reference: #Reference<0.1373489635.746717252.118288>} - """ + @moduledoc false use Supervisor @@ -40,9 +7,7 @@ defmodule Zenohex.Examples.Subscriber do alias Zenohex.Examples.Subscriber - @doc """ - Start Subscriber. - """ + @doc "Start Subscriber." def start_link(args \\ %{}) when is_map(args) do session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/**") diff --git a/mix.exs b/mix.exs index f4e9363..e851e2d 100644 --- a/mix.exs +++ b/mix.exs @@ -86,7 +86,6 @@ defmodule Zenohex.MixProject do Zenohex.Subscriber.Options ], Examples: [ - Zenohex.Examples.Subscriber, Zenohex.Examples.PullSubscriber, Zenohex.Examples.Session, Zenohex.Examples.Queryable, From a7499dd74f3c78da212a8bf3c3ecb2a6df651c26 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 15:11:10 +0900 Subject: [PATCH 155/165] Move Examples.PullSubscriber doc to lib/zenohex/examples/README.md --- lib/zenohex/examples/README.md | 33 +++++++++++++++++++- lib/zenohex/examples/pull_subscriber.ex | 41 ++----------------------- mix.exs | 1 - 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/lib/zenohex/examples/README.md b/lib/zenohex/examples/README.md index 04d79d9..2a43f18 100644 --- a/lib/zenohex/examples/README.md +++ b/lib/zenohex/examples/README.md @@ -85,7 +85,38 @@ iex> Publisher.put("subscribed?") 11:51:53.959 [debug] %Zenohex.Sample{key_expr: "zenohex/examples/pub", value: "subscribed?", kind: :put, reference: #Reference<0.1373489635.746717252.118288>} ``` -### PullSubscriber +## PullSubscriber + +This PullSubscriber is made of `Supervisor` and `GenServer`. +If you would like to see the codes, check the followings. + +- Supervisor + - [lib/zenohex/examples/pull_subscriber.ex](/lib/zenohex/examples/pull_subscriber.ex) +- GenServer + - [lib/zenohex/examples/pull_subscriber/impl.ex](/lib/zenohex/examples/pull_subscriber/impl.ex) + +### Start PullSubscriber + +```elixir +iex> alias Zenohex.Examples.PullSubscriber +# if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**",callback is &Logger.debug(inspect(&1)) +iex> PullSubscriber.start_link() +# you can also inject your session, key_expr and callback from outside +iex> PullSubscriber.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) +``` + +### Pull data + +```elixir +iex> alias Zenohex.Examples.Publisher +iex> Publisher.start_link() +iex> Publisher.put("subscribed?") +:ok +iex> PullSubscriber.pull() +:ok + +12:16:47.306 [debug] %Zenohex.Sample{key_expr: "zenohex/examples/pub", value: "subscribed?", kind: :put, reference: #Reference<0.662543409.1019347013.179304>} +``` ### Queryable diff --git a/lib/zenohex/examples/pull_subscriber.ex b/lib/zenohex/examples/pull_subscriber.ex index 65d7595..5d86cc3 100644 --- a/lib/zenohex/examples/pull_subscriber.ex +++ b/lib/zenohex/examples/pull_subscriber.ex @@ -1,40 +1,5 @@ defmodule Zenohex.Examples.PullSubscriber do - mix_config = Mix.Project.config() - version = mix_config[:version] - base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" - - @moduledoc """ - This is the example PullSubscriber implementation using Zenohex. - - This PullSubscriber is made of `m:Supervisor` and `m:GenServer`. - If you would like to see the codes, check the followings. - - * Supervisor - * [lib/zenohex/examples/pull_subscriber.ex](#{base_url}/pull_subscriber.ex) - * GenServer - * [lib/zenohex/examples/pull_subscriber/impl.ex](#{base_url}/pull_subscriber/impl.ex) - - ## Getting Started - - ### Start PullSubscriber - - iex> alias Zenohex.Examples.PullSubscriber - # if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**",callback is &Logger.debug(inspect(&1)) - iex> PullSubscriber.start_link() - # you can also inject your session, key_expr and callback from outside - iex> PullSubscriber.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) - - ### Pull data - - iex> alias Zenohex.Examples.Publisher - iex> Publisher.start_link() - iex> Publisher.put("subscribed?") - :ok - iex> PullSubscriber.pull() - :ok - - 12:16:47.306 [debug] %Zenohex.Sample{key_expr: "zenohex/examples/pub", value: "subscribed?", kind: :put, reference: #Reference<0.662543409.1019347013.179304>} - """ + @moduledoc false use Supervisor @@ -42,9 +7,7 @@ defmodule Zenohex.Examples.PullSubscriber do alias Zenohex.Examples.PullSubscriber - @doc """ - Start PullSubscriber. - """ + @doc "Start PullSubscriber." def start_link(args \\ %{}) when is_map(args) do session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/**") diff --git a/mix.exs b/mix.exs index e851e2d..2e89b26 100644 --- a/mix.exs +++ b/mix.exs @@ -86,7 +86,6 @@ defmodule Zenohex.MixProject do Zenohex.Subscriber.Options ], Examples: [ - Zenohex.Examples.PullSubscriber, Zenohex.Examples.Session, Zenohex.Examples.Queryable, Zenohex.Examples.Storage From 5be10ee88768880123ed5a118660e652df3beebd Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 15:19:32 +0900 Subject: [PATCH 156/165] Move Examples.Queryable doc to lib/zenohex/examples/README.md --- lib/zenohex/examples/README.md | 31 +++++++++++++++++++++++- lib/zenohex/examples/queryable.ex | 39 ++----------------------------- mix.exs | 1 - 3 files changed, 32 insertions(+), 39 deletions(-) diff --git a/lib/zenohex/examples/README.md b/lib/zenohex/examples/README.md index 2a43f18..1a90844 100644 --- a/lib/zenohex/examples/README.md +++ b/lib/zenohex/examples/README.md @@ -118,7 +118,36 @@ iex> PullSubscriber.pull() 12:16:47.306 [debug] %Zenohex.Sample{key_expr: "zenohex/examples/pub", value: "subscribed?", kind: :put, reference: #Reference<0.662543409.1019347013.179304>} ``` -### Queryable +## Queryable + +This Queryable is made of `Supervisor` and `GenServer`. +If you would like to see the codes, check the followings. + +- Supervisor + - [lib/zenohex/examples/queryable.ex](/lib/zenohex/examples/queryable.ex) +- GenServer + - [lib/zenohex/examples/queryable/impl.ex](/lib/zenohex/examples/queryable/impl.ex) + +### Start Queryable + +```elixir +iex> alias Zenohex.Examples.Queryable +# if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**", callback is &Logger.debug(inspect(&1)) +iex> Queryable.start_link() +# you can also inject your session, key_expr and callback from outside +iex> Queryable.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) +``` + +### Queried? + +```elixir +iex> alias Zenohex.Examples.Session +iex> Session.start_link() +iex> Session.get("zenohex/examples/get", &IO.inspect/1) +:ok + +15:20:17.870 [debug] %Zenohex.Query{key_expr: "zenohex/examples/get", parameters: "", value: :undefined, reference: #Reference<0.3076585362.3463839816.144434>} +``` ### Session diff --git a/lib/zenohex/examples/queryable.ex b/lib/zenohex/examples/queryable.ex index 51561cc..a986e1a 100644 --- a/lib/zenohex/examples/queryable.ex +++ b/lib/zenohex/examples/queryable.ex @@ -1,38 +1,5 @@ defmodule Zenohex.Examples.Queryable do - mix_config = Mix.Project.config() - version = mix_config[:version] - base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" - - @moduledoc """ - This is the example Queryable implementation using Zenohex. - - This Queryable is made of `m:Supervisor` and `m:GenServer`. - If you would like to see the codes, check the followings. - - * Supervisor - * [lib/zenohex/examples/queryable.ex](#{base_url}/queryable.ex) - * GenServer - * [lib/zenohex/examples/queryable/impl.ex](#{base_url}/queryable/impl.ex) - - ## Getting Started - - ### Start Queryable - - iex> alias Zenohex.Examples.Queryable - # if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**", callback is &Logger.debug(inspect(&1)) - iex> Queryable.start_link() - # you can also inject your session, key_expr and callback from outside - iex> Queryable.start_link(%{session: your_session, key_expr: "your_key/expression/**", callback: &IO.inspect/1}) - - ### Queried? - - iex> alias Zenohex.Examples.Session - iex> Session.start_link() - iex> Session.get("zenohex/examples/get", &IO.inspect/1) - :ok - - 15:20:17.870 [debug] %Zenohex.Query{key_expr: "zenohex/examples/get", parameters: "", value: :undefined, reference: #Reference<0.3076585362.3463839816.144434>} - """ + @moduledoc false use Supervisor @@ -40,9 +7,7 @@ defmodule Zenohex.Examples.Queryable do alias Zenohex.Examples.Queryable - @doc """ - Start Queryable. - """ + @doc "Start Queryable." def start_link(args \\ %{}) when is_map(args) do session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/**") diff --git a/mix.exs b/mix.exs index 2e89b26..19a60ec 100644 --- a/mix.exs +++ b/mix.exs @@ -87,7 +87,6 @@ defmodule Zenohex.MixProject do ], Examples: [ Zenohex.Examples.Session, - Zenohex.Examples.Queryable, Zenohex.Examples.Storage ] ] From a36e97cd090a9a3e2cc19bb69634ea238930d8cf Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 15:25:17 +0900 Subject: [PATCH 157/165] Move Examples.Session doc to lib/zenohex/examples/README.md --- lib/zenohex/examples/README.md | 42 ++++++++++++++++++++++++++++- lib/zenohex/examples/session.ex | 47 ++------------------------------- mix.exs | 1 - 3 files changed, 43 insertions(+), 47 deletions(-) diff --git a/lib/zenohex/examples/README.md b/lib/zenohex/examples/README.md index 1a90844..b2bc0c7 100644 --- a/lib/zenohex/examples/README.md +++ b/lib/zenohex/examples/README.md @@ -149,6 +149,46 @@ iex> Session.get("zenohex/examples/get", &IO.inspect/1) 15:20:17.870 [debug] %Zenohex.Query{key_expr: "zenohex/examples/get", parameters: "", value: :undefined, reference: #Reference<0.3076585362.3463839816.144434>} ``` -### Session +## Session + +This Session is made of `Supervisor` and `GenServer`. +If you would like to see the codes, check the followings. + +- Supervisor + - [lib/zenohex/examples/session.ex](/lib/zenohex/examples/session.ex) +- GenServer + - [lib/zenohex/examples/session/impl.ex](/lib/zenohex/examples/session/impl.ex) + +### Start Session + +```elixir +iex> alias Zenohex.Examples.Session +# if not specify session, it is made internally +iex> Session.start_link() +# you can also inject your session and key_expr from outside +iex> Session.start_link(%{session: your_session}) +``` + +### Put data + +```elixir +iex> Session.put("zenoh/example/session/put", 42) # integer +iex> Session.put("zenoh/example/session/put", 42.42) # float +iex> Session.put("zenoh/example/session/put", "42") # binary +``` + +### Delete data + +```elixir +iex> Session.delete("zenoh/example/session/put") +iex> Session.delete("zenoh/example/session/**") +``` + +### Get data + +```elixir +iex> callback = &IO.inspect/1 +iex> Session.get("zenoh/example/session/get", callback) +``` ### Storage diff --git a/lib/zenohex/examples/session.ex b/lib/zenohex/examples/session.ex index c3d0574..42d5926 100644 --- a/lib/zenohex/examples/session.ex +++ b/lib/zenohex/examples/session.ex @@ -1,54 +1,11 @@ defmodule Zenohex.Examples.Session do - mix_config = Mix.Project.config() - version = mix_config[:version] - base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" - - @moduledoc """ - This is the example Session implementation using Zenohex. - - This Session is made of `m:Supervisor` and `m:GenServer`. - If you would like to see the codes, check the followings. - - * Supervisor - * [lib/zenohex/examples/session.ex](#{base_url}/session.ex) - * GenServer - * [lib/zenohex/examples/session/impl.ex](#{base_url}/session/impl.ex) - - ## Getting Started - - ### Start Session - - iex> alias Zenohex.Examples.Session - # if not specify session, it is made internally - iex> Session.start_link() - # you can also inject your session and key_expr from outside - iex> Session.start_link(%{session: your_session}) - - ### Put data - - iex> Session.put("zenoh/example/session/put", 42) # integer - iex> Session.put("zenoh/example/session/put", 42.42) # float - iex> Session.put("zenoh/example/session/put", "42") # binary - - ### Delete data - - iex> Session.delete("zenoh/example/session/put") - iex> Session.delete("zenoh/example/session/**") - - ### Get data - - iex> callback = &IO.inspect/1 - iex> Session.get("zenoh/example/session/get", callback) - - """ + @moduledoc false use Supervisor alias Zenohex.Examples.Session - @doc """ - Start Session. - """ + @doc "Start Session." def start_link(args \\ %{}) when is_map(args) do session = Map.get(args, :session) || Zenohex.open!() Supervisor.start_link(__MODULE__, %{session: session}, name: __MODULE__) diff --git a/mix.exs b/mix.exs index 19a60ec..4d17fa8 100644 --- a/mix.exs +++ b/mix.exs @@ -86,7 +86,6 @@ defmodule Zenohex.MixProject do Zenohex.Subscriber.Options ], Examples: [ - Zenohex.Examples.Session, Zenohex.Examples.Storage ] ] From 5e6552969c8793c9b53b0a94af689a0db3327ad3 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 15:32:52 +0900 Subject: [PATCH 158/165] Move Examples.Storage doc to lib/zenohex/examples/README.md --- lib/zenohex/examples/README.md | 45 +++++++++++++++++++++++++++- lib/zenohex/examples/storage.ex | 53 ++------------------------------- mix.exs | 1 - 3 files changed, 46 insertions(+), 53 deletions(-) diff --git a/lib/zenohex/examples/README.md b/lib/zenohex/examples/README.md index b2bc0c7..db10b09 100644 --- a/lib/zenohex/examples/README.md +++ b/lib/zenohex/examples/README.md @@ -191,4 +191,47 @@ iex> callback = &IO.inspect/1 iex> Session.get("zenoh/example/session/get", callback) ``` -### Storage +## Storage + +This Storage is made of `Supervisor` and `GenServer`. +If you would like to see the codes, check the followings. + +- Supervisor + - [lib/zenohex/examples/storage.ex](/lib/zenohex/examples/storage.ex) +- GenServer + - [lib/zenohex/examples/storage/store.ex](/lib/zenohex/examples/storage/store.ex) + - [lib/zenohex/examples/storage/subscriber.ex](/lib/zenohex/examples/storage/subscriber.ex) + - [lib/zenohex/examples/storage/queryable.ex](/lib/zenohex/examples/storage/queryable.ex) + +In this example, we made store with `Agent`. We think we can use also `:ets`, `:dets` and `:mnesia`. + +### Start Storage + +```elixir +iex> alias Zenohex.Examples.Storage +# if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**" +iex> Storage.start_link() +# you can also inject your session, key_expr and callback from outside +iex> Storage.start_link(%{session: your_session, key_expr: "your_key/expression/**"}) +``` + +### Session put/get/delete data with Storage + +```elixir +iex> alias Zenohex.Examples.Session +iex> Session.start_link() +iex> Session.put("zenoh/examples/storage", _value = "put") +:ok +iex> Session.get("zenoh/examples/storage", _callback = &IO.inspect/1) +:ok +%Zenohex.Sample{ + key_expr: "zenohex/examples/storage", + value: "put", + kind: :put, + reference: #Reference<0.2244884903.1591869505.81651> +} +iex> Session.delete("zenoh/examples/storage") +:ok +iex> Session.get("zenoh/examples/storage", &IO.inspect/1) +:ok +``` diff --git a/lib/zenohex/examples/storage.ex b/lib/zenohex/examples/storage.ex index 19f3f4e..cead80e 100644 --- a/lib/zenohex/examples/storage.ex +++ b/lib/zenohex/examples/storage.ex @@ -1,60 +1,11 @@ defmodule Zenohex.Examples.Storage do - mix_config = Mix.Project.config() - version = mix_config[:version] - base_url = "https://github.com/b5g-ex/zenohex/tree/v#{version}/lib/examples" - - @moduledoc """ - This is the example Storage implementation using Zenohex. - - This Storage is made of `m:Supervisor` and `m:GenServer`. - If you would like to see the codes, check the followings. - - * Supervisor - * [lib/zenohex/examples/storage.ex](#{base_url}/storage.ex) - * GenServer - * [lib/zenohex/examples/storage/store.ex](#{base_url}/storage/store.ex) - * [lib/zenohex/examples/storage/subscriber.ex](#{base_url}/storage/subscriber.ex) - * [lib/zenohex/examples/storage/queryable.ex](#{base_url}/storage/queryable.ex) - - In this example, we made store with `m:Agent`. We think we can use also `:ets`, `:dets` and `:mnesia`. - - ## Getting Started - - ### Start Storage - - iex> alias Zenohex.Examples.Storage - # if not specify session, key_expr and callback, they are made internally. key_expr is "zenohex/examples/**" - iex> Storage.start_link() - # you can also inject your session, key_expr and callback from outside - iex> Storage.start_link(%{session: your_session, key_expr: "your_key/expression/**"}) - - ### Session put/get/delete data with Storage - - iex> alias Zenohex.Examples.Session - iex> Session.start_link() - iex> Session.put("zenoh/examples/storage", _value = "put") - :ok - iex> Session.get("zenoh/examples/storage", _callback = &IO.inspect/1) - :ok - %Zenohex.Sample{ - key_expr: "zenohex/examples/storage", - value: "put", - kind: :put, - reference: #Reference<0.2244884903.1591869505.81651> - } - iex> Session.delete("zenoh/examples/storage") - :ok - iex> Session.get("zenoh/examples/storage", &IO.inspect/1) - :ok - """ + @moduledoc false use Supervisor alias Zenohex.Examples.Storage - @doc """ - Start storage. - """ + @doc "Start storage." def start_link(args \\ %{}) when is_map(args) do session = Map.get(args, :session) || Zenohex.open!() key_expr = Map.get(args, :key_expr, "zenohex/examples/**") diff --git a/mix.exs b/mix.exs index 4d17fa8..e55aadf 100644 --- a/mix.exs +++ b/mix.exs @@ -86,7 +86,6 @@ defmodule Zenohex.MixProject do Zenohex.Subscriber.Options ], Examples: [ - Zenohex.Examples.Storage ] ] ] From eb0335202bc6c1e27e04553782af90c40d225bb7 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 15:33:22 +0900 Subject: [PATCH 159/165] Remove Examples section from mix docs --- mix.exs | 2 -- 1 file changed, 2 deletions(-) diff --git a/mix.exs b/mix.exs index e55aadf..4d8670e 100644 --- a/mix.exs +++ b/mix.exs @@ -84,8 +84,6 @@ defmodule Zenohex.MixProject do Zenohex.Query.Options, Zenohex.Queryable.Options, Zenohex.Subscriber.Options - ], - Examples: [ ] ] ] From f5a900ed080fbd50ab7008fda62c7caa096f8cb2 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 15:42:02 +0900 Subject: [PATCH 160/165] Update README.md --- README.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index c7aa82c..91e2902 100644 --- a/README.md +++ b/README.md @@ -63,18 +63,9 @@ iex(6)> Zenohex.Subscriber.recv_timeout(subscriber, 1000) ### Practical examples -We implemented following practical examples under the [lib/zenohex/examples](lib/zenohex/examples) with moduledoc. +We implemented practical examples under the [lib/zenohex/examples](https://github.com/b5g-ex/zenohex/tree/v0.2.0-rc.2/lib/zenohex/examples). -(from hexdocs please refer to MODULES tab's EXAMPLE section) - -- [Publisher](lib/zenohex/examples/publisher.ex) -- [Subscriber](lib/zenohex/examples/subscriber.ex) -- [PullSubscriber](lib/zenohex/examples/pull_subscriber.ex) -- [Session](lib/zenohex/examples/session.ex) -- [Queryable](lib/zenohex/examples/queryable.ex) -- [Storage](lib/zenohex/examples/storage.ex) - -Use them as reference for your implementation. +Please read the [lib/zenohex/examples/README.md](https://github.com/b5g-ex/zenohex/tree/v0.2.0-rc.2/lib/zenohex/examples/README.md) to use them as your implementation's reference. ## For developer From 16bcc418e53cade42da8fbe69f1a7dc913a89bfa Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Fri, 16 Feb 2024 15:59:33 +0900 Subject: [PATCH 161/165] Exclude lib/zenohex/examples directory from package files --- mix.exs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 4d8670e..0f8c292 100644 --- a/mix.exs +++ b/mix.exs @@ -54,7 +54,9 @@ defmodule Zenohex.MixProject do [ name: "zenohex", files: [ - "lib", + "lib/zenohex.ex", + "lib/zenohex/config", + "lib/zenohex/*.ex", "native/zenohex_nif/.cargo", "native/zenohex_nif/src", "native/zenohex_nif/Cargo*", From 43283be9f9fa50c1c569b77654d4e4bb555e74a5 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 19 Feb 2024 09:36:31 +0900 Subject: [PATCH 162/165] Update .github/workflows/ci.yaml, remove `on push` --- .github/workflows/ci.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3272b5e..1011bcb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -8,8 +8,6 @@ env: # based https://github.com/erlef/setup-beam on: - push: - branches: main pull_request: jobs: From 9e9995a17c8a83deb72c9594b71c0ac6b19b3e3e Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 19 Feb 2024 09:37:11 +0900 Subject: [PATCH 163/165] Rename .github/workflows/ci.yaml to ci.yml --- .github/workflows/{ci.yaml => ci.yml} | 0 test/version_match_test.exs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{ci.yaml => ci.yml} (100%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yml similarity index 100% rename from .github/workflows/ci.yaml rename to .github/workflows/ci.yml diff --git a/test/version_match_test.exs b/test/version_match_test.exs index 9ef85ae..0204ac2 100644 --- a/test/version_match_test.exs +++ b/test/version_match_test.exs @@ -23,7 +23,7 @@ defmodule Zenohex.VersionMatchTest do end) ciyaml_versions_map = - File.read!(".github/workflows/ci.yaml") + File.read!(".github/workflows/ci.yml") |> String.split("\n") |> Enum.reduce(%{}, fn line, acc -> cond do From 4c882c8c4aa62c5d2f59026279a2e5ed0ac0f8d1 Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 19 Feb 2024 12:20:37 +0900 Subject: [PATCH 164/165] Update .github/workflows/ci.yml Add trigger condtion on push to main Co-authored-by: takasehideki --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1011bcb..6503bcf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,9 @@ env: on: pull_request: + push: + branches: + - main jobs: build-deps: From e17cd0adef8c32ea8f88f6e0ca666a86bf46bdde Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Mon, 19 Feb 2024 13:39:55 +0900 Subject: [PATCH 165/165] Remove unnecessary `uses` from .github/workflows/ci.yml --- .github/workflows/ci.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6503bcf..73e6d11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,10 +51,6 @@ jobs: otp-version: ${{env.OTP_VERSION}} elixir-version: ${{env.ELIXIR_VERSION}} - - uses: dtolnay/rust-toolchain@stable - with: - components: rustfmt - - uses: actions/cache/restore@v4 id: restore-deps-cache with: