capnp_cookbook_2/src/main.rs

46 lines
1.2 KiB
Rust

extern crate capnp;
pub mod point_capnp {
include!(concat!(env!("OUT_DIR"), "/point_capnp.rs"));
}
fn main() {
let mut builder = capnp::message::Builder::new_default();
{
let mut point_msg = builder.init_root::<point_capnp::point::Builder>();
point_msg.set_x(12);
point_msg.set_y(14);
}
let mut buffer = Vec::new();
capnp::serialize::write_message(&mut buffer, &builder).unwrap();
let deserialized = capnp::serialize::read_message(
&mut buffer.as_slice(),
capnp::message::ReaderOptions::new()
).unwrap();
let point_reader: capnp::message::TypedReader<capnp::serialize::OwnedSegments, point_capnp::point::Owned> =
capnp::message::TypedReader::new(deserialized);
// Because the point_reader is now working with OwnedSegments (which are owned vectors) and an Owned message
// (which is 'static lifetime), this is now safe
let handle = std::thread::spawn(move || {
// The point_reader owns its data, and we use .get() to retrieve the actual point_capnp::point::Reader
// object from it
let point_root = point_reader.get().unwrap();
assert_eq!(point_root.get_x(), 12);
assert_eq!(point_root.get_y(), 14);
});
handle.join().unwrap();
}