From 3501b3936ef8adb9f887aa57cc9d86e9d969e76d Mon Sep 17 00:00:00 2001 From: Ryota Kinukawa Date: Thu, 25 Jan 2024 21:06:03 +0900 Subject: [PATCH] [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