Skip to content

Commit

Permalink
[zenohex_nif] Improve QueryableOptions
Browse files Browse the repository at this point in the history
  • Loading branch information
pojiro committed Jan 25, 2024
1 parent 45e13fc commit 3501b39
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 18 deletions.
3 changes: 2 additions & 1 deletion lib/zenohex/nif.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
8 changes: 8 additions & 0 deletions lib/zenohex/queryable.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
defmodule Zenohex.Queryable do
@type t :: reference()
@type complete :: boolean()

defmodule Options do
defstruct complete: false
end
end
30 changes: 14 additions & 16 deletions native/zenohex_nif/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::{
Expand All @@ -17,7 +17,6 @@ use zenoh::{queryable::Query, sample::Sample};
mod atoms {
rustler::atoms! {
timeout,
complete,
}
}

Expand Down Expand Up @@ -260,22 +259,15 @@ fn pull_subscriber_pull(resource: ResourceArc<ExPullSubscriberRef>) -> Atom {
fn declare_queryable(
resource: ResourceArc<ExSessionRef>,
key_expr: String,
opts: ListIterator,
opts: QueryableOptions,
) -> ResourceArc<ExQueryableRef> {
let session: &Arc<Session> = &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<Query>> =
builder.res_sync().expect("declare_queryable failed");
let queryable: Queryable<'_, Receiver<Query>> = session
.declare_queryable(key_expr)
.complete(opts.complete)
.res_sync()
.expect("declare_queryable failed");

ResourceArc::new(ExQueryableRef(queryable))
}

Expand Down Expand Up @@ -347,6 +339,12 @@ impl From<Reliability> 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!(),
Expand Down
5 changes: 4 additions & 1 deletion test/zenohex/nif_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 3501b39

Please sign in to comment.