Rust
Module reorganization
We reorganized the module tree, so import paths are not the same as before. The main difference is that everything should be imported via the root path zenoh::
. Here are some examples, but you can look into zenoh/src/lib.rs
for the complete list of changes.
// common use
+Rust
Module reorganization
We reorganized the module tree, so import paths are not the same as before. The main difference is that everything should be imported via the root path zenoh::
. Here are some examples, but you can look into zenoh/src/lib.rs
for the complete list of changes.
// common use
use zenoh::config::*;
use zenoh::{Config, Error, Result};
@@ -72,7 +72,24 @@
// **when all remaining data has been processed**.
// subscriber undeclaration has not been sent on the wire
subscriber_task.await.unwrap()
-
Value is gone, long live ZBytes
We have replaced Value
with ZBytes
and Encoding
, and added a number of conversion implementations such that user structs can be serialized into ZBytes
, sent via Zenoh, and de-serialized from ZBytes
with ease.
This is facilitated through the ZSerde
struct, and implementations of the traits
+
Callbacks run in background until session is closed
Session entities, e.g. subscribers, declared with callbacks are no longer undeclared when they are dropped; there is no longer need to keep a reference to an entity when the intent is to have it run until the session is closed.
let session = zenoh::open(zenoh::config::default()).await.unwrap();
+session
+ .declare_subscriber("key/ expression")
+ .callback(|sample| { println!("Received: {} {:?}", sample. key_expr(), sample. payload()) })
+ .await
+ .unwrap();
+// subscriber run in background until the session is closed
+// no need to keep a variable around
+
If you still want the entity to be undeclared when dropped, you can simply use with
instead of callback
; it may just require you to annotate the callback, as type inference is not as good as with callback
method.
let session = zenoh::open(zenoh::config::default()).await.unwrap();
+let subscriber = session
+ .declare_subscriber("key/ expression")
+ // annotation needed
+ .with(|sample: Sample| { println!("Received: {} {:?}", sample. key_expr(), sample. payload()) })
+ .await
+ .unwrap();
+// subscriber is undeclared when dropped
+
Going into details, a new method undeclare_on_drop(bool)
– default to true
, has been added to the builders, and callback(cb)
is now simply a shortcut to with(cb).undeclare_on_drop(false)
.
+However, the normal user would rarely need to call this method directly.
Value is gone, long live ZBytes
We have replaced Value
with ZBytes
and Encoding
, and added a number of conversion implementations such that user structs can be serialized into ZBytes
, sent via Zenoh, and de-serialized from ZBytes
with ease.
This is facilitated through the ZSerde
struct, and implementations of the traits
zenoh::bytes::Deserialize
and zenoh::bytes::Serialize
.
We provide implementations of Zenoh’s aforementioned Deserialize
and Serialize
traits for primitive Rust types, Rust’s Vec
, the Value
type exposed by Serde
’s various libraries as well as an example of Protobuf
’s prost::Message
type.
You can look at a full set of examples in examples/examples/z_bytes.rs
.
NOTE: ⚠️ ZSerde
is not the only serializer/deserializer users can make use of, nor a limitation to the types supported by Zenoh. Users are free to use whichever serializer/deserializer they wish!
- Zenoh 0.11.x
let sample = subscriber.recv_async().await.unwrap();
let value: Value = sample.value;
let the_string: String = value.try_into().unwrap();