mirror of
https://github.com/bspeice/capnp_cookbook_2
synced 2024-11-23 08:28:09 -05:00
Update main.rs to move messages across threads
This commit is contained in:
parent
838de4e485
commit
0d4cc1ffcd
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -12,7 +12,7 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "capnp_cookbook_1"
|
name = "capnp_cookbook_2"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"capnp 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"capnp 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "capnp_cookbook_1"
|
name = "capnp_cookbook_2"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Bradlee Speice <bspeice@kcg.com>"]
|
authors = ["Bradlee Speice <bspeice@kcg.com>"]
|
||||||
|
|
||||||
|
BIN
src/.main.rs.swp
Normal file
BIN
src/.main.rs.swp
Normal file
Binary file not shown.
44
src/main.rs
44
src/main.rs
@ -1,57 +1,45 @@
|
|||||||
// Note that we use `capnp` here, NOT `capnpc`
|
|
||||||
extern crate capnp;
|
extern crate capnp;
|
||||||
|
|
||||||
// We create a module here to define how we are to access the code
|
|
||||||
// being included.
|
|
||||||
pub mod point_capnp {
|
pub mod point_capnp {
|
||||||
// The environment variable OUT_DIR is set by Cargo, and
|
|
||||||
// is the location of all the code that was built as part
|
|
||||||
// of the codegen step.
|
|
||||||
// point_capnp.rs is the actual file to include
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/point_capnp.rs"));
|
include!(concat!(env!("OUT_DIR"), "/point_capnp.rs"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
||||||
// The process of building a Cap'N Proto message is a bit tedious.
|
|
||||||
// We start by creating a generic Builder; it acts as the message
|
|
||||||
// container that we'll later be filling with content of our `Point`
|
|
||||||
let mut builder = capnp::message::Builder::new_default();
|
let mut builder = capnp::message::Builder::new_default();
|
||||||
|
|
||||||
// Because we need a mutable reference to the `builder` later,
|
|
||||||
// we fence off this part of the code to allow sequential mutable
|
|
||||||
// borrows. As I understand it, non-lexical lifetimes:
|
|
||||||
// https://github.com/rust-lang/rust-roadmap/issues/16
|
|
||||||
// will make this no longer necessary
|
|
||||||
{
|
{
|
||||||
// And now we can set up the actual message we're trying to create
|
|
||||||
let mut point_msg = builder.init_root::<point_capnp::point::Builder>();
|
let mut point_msg = builder.init_root::<point_capnp::point::Builder>();
|
||||||
|
|
||||||
// Stuff our message with some content
|
|
||||||
point_msg.set_x(12);
|
point_msg.set_x(12);
|
||||||
|
|
||||||
point_msg.set_y(14);
|
point_msg.set_y(14);
|
||||||
}
|
}
|
||||||
|
|
||||||
// It's now time to serialize our message to binary. Let's set up a buffer for that:
|
|
||||||
let mut buffer = Vec::new();
|
let mut buffer = Vec::new();
|
||||||
|
|
||||||
// And actually fill that buffer with our data
|
|
||||||
capnp::serialize::write_message(&mut buffer, &builder).unwrap();
|
capnp::serialize::write_message(&mut buffer, &builder).unwrap();
|
||||||
|
|
||||||
// Finally, let's deserialize the data
|
|
||||||
let deserialized = capnp::serialize::read_message(
|
let deserialized = capnp::serialize::read_message(
|
||||||
&mut buffer.as_slice(),
|
&mut buffer.as_slice(),
|
||||||
capnp::message::ReaderOptions::new()
|
capnp::message::ReaderOptions::new()
|
||||||
).unwrap();
|
).unwrap();
|
||||||
|
|
||||||
// `deserialized` is currently a generic reader; it understands
|
let point_reader: capnp::message::TypedReader<capnp::serialize::OwnedSegments, point_capnp::point::Owned> =
|
||||||
// the content of the message we gave it (i.e. that there are two
|
capnp::message::TypedReader::new(deserialized);
|
||||||
// int32 values) but doesn't really know what they represent (the Point).
|
|
||||||
// This is where we map the generic data back into our schema.
|
|
||||||
let point_reader = deserialized.get_root::<point_capnp::point::Reader>().unwrap();
|
|
||||||
|
|
||||||
// We can now get our x and y values back, and make sure they match
|
// Because the point_reader is now working with OwnedSegments (which are owned vectors) and an Owned message
|
||||||
assert_eq!(point_reader.get_x(), 12);
|
// (which is 'static lifetime), this is now safe
|
||||||
assert_eq!(point_reader.get_y(), 14);
|
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();
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1,135 @@
|
|||||||
|
// Generated by the capnpc-rust plugin to the Cap'n Proto schema compiler.
|
||||||
|
// DO NOT EDIT.
|
||||||
|
// source: point.capnp
|
||||||
|
|
||||||
|
|
||||||
|
pub mod point {
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct Owned;
|
||||||
|
impl <'a> ::capnp::traits::Owned<'a> for Owned { type Reader = Reader<'a>; type Builder = Builder<'a>; }
|
||||||
|
impl <'a> ::capnp::traits::OwnedStruct<'a> for Owned { type Reader = Reader<'a>; type Builder = Builder<'a>; }
|
||||||
|
impl ::capnp::traits::Pipelined for Owned { type Pipeline = Pipeline; }
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub struct Reader<'a> { reader: ::capnp::private::layout::StructReader<'a> }
|
||||||
|
|
||||||
|
impl <'a,> ::capnp::traits::HasTypeId for Reader<'a,> {
|
||||||
|
#[inline]
|
||||||
|
fn type_id() -> u64 { _private::TYPE_ID }
|
||||||
|
}
|
||||||
|
impl <'a,> ::capnp::traits::FromStructReader<'a> for Reader<'a,> {
|
||||||
|
fn new(reader: ::capnp::private::layout::StructReader<'a>) -> Reader<'a,> {
|
||||||
|
Reader { reader: reader, }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <'a,> ::capnp::traits::FromPointerReader<'a> for Reader<'a,> {
|
||||||
|
fn get_from_pointer(reader: &::capnp::private::layout::PointerReader<'a>) -> ::capnp::Result<Reader<'a,>> {
|
||||||
|
::std::result::Result::Ok(::capnp::traits::FromStructReader::new(try!(reader.get_struct(::std::ptr::null()))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <'a,> ::capnp::traits::Imbue<'a> for Reader<'a,> {
|
||||||
|
fn imbue(&mut self, cap_table: &'a ::capnp::private::layout::CapTable) {
|
||||||
|
self.reader.imbue(::capnp::private::layout::CapTableReader::Plain(cap_table))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <'a,> Reader<'a,> {
|
||||||
|
pub fn borrow<'b>(&'b self) -> Reader<'b,> {
|
||||||
|
Reader { .. *self }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
|
||||||
|
self.reader.total_size()
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn get_x(self) -> i32 {
|
||||||
|
self.reader.get_data_field::<i32>(0)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn get_y(self) -> i32 {
|
||||||
|
self.reader.get_data_field::<i32>(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Builder<'a> { builder: ::capnp::private::layout::StructBuilder<'a> }
|
||||||
|
impl <'a,> ::capnp::traits::HasStructSize for Builder<'a,> {
|
||||||
|
#[inline]
|
||||||
|
fn struct_size() -> ::capnp::private::layout::StructSize { _private::STRUCT_SIZE }
|
||||||
|
}
|
||||||
|
impl <'a,> ::capnp::traits::HasTypeId for Builder<'a,> {
|
||||||
|
#[inline]
|
||||||
|
fn type_id() -> u64 { _private::TYPE_ID }
|
||||||
|
}
|
||||||
|
impl <'a,> ::capnp::traits::FromStructBuilder<'a> for Builder<'a,> {
|
||||||
|
fn new(builder: ::capnp::private::layout::StructBuilder<'a>) -> Builder<'a, > {
|
||||||
|
Builder { builder: builder, }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <'a,> ::capnp::traits::ImbueMut<'a> for Builder<'a,> {
|
||||||
|
fn imbue_mut(&mut self, cap_table: &'a mut ::capnp::private::layout::CapTable) {
|
||||||
|
self.builder.imbue(::capnp::private::layout::CapTableBuilder::Plain(cap_table))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <'a,> ::capnp::traits::FromPointerBuilder<'a> for Builder<'a,> {
|
||||||
|
fn init_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>, _size: u32) -> Builder<'a,> {
|
||||||
|
::capnp::traits::FromStructBuilder::new(builder.init_struct(_private::STRUCT_SIZE))
|
||||||
|
}
|
||||||
|
fn get_from_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>) -> ::capnp::Result<Builder<'a,>> {
|
||||||
|
::std::result::Result::Ok(::capnp::traits::FromStructBuilder::new(try!(builder.get_struct(_private::STRUCT_SIZE, ::std::ptr::null()))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <'a,> ::capnp::traits::SetPointerBuilder<Builder<'a,>> for Reader<'a,> {
|
||||||
|
fn set_pointer_builder<'b>(pointer: ::capnp::private::layout::PointerBuilder<'b>, value: Reader<'a,>) -> ::capnp::Result<()> { pointer.set_struct(&value.reader) }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <'a,> Builder<'a,> {
|
||||||
|
pub fn as_reader(self) -> Reader<'a,> {
|
||||||
|
::capnp::traits::FromStructReader::new(self.builder.as_reader())
|
||||||
|
}
|
||||||
|
pub fn borrow<'b>(&'b mut self) -> Builder<'b,> {
|
||||||
|
Builder { .. *self }
|
||||||
|
}
|
||||||
|
pub fn borrow_as_reader<'b>(&'b self) -> Reader<'b,> {
|
||||||
|
::capnp::traits::FromStructReader::new(self.builder.as_reader())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
|
||||||
|
self.builder.as_reader().total_size()
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn get_x(self) -> i32 {
|
||||||
|
self.builder.get_data_field::<i32>(0)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn set_x(&mut self, value: i32) {
|
||||||
|
self.builder.set_data_field::<i32>(0, value);
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn get_y(self) -> i32 {
|
||||||
|
self.builder.get_data_field::<i32>(1)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn set_y(&mut self, value: i32) {
|
||||||
|
self.builder.set_data_field::<i32>(1, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Pipeline { _typeless: ::capnp::any_pointer::Pipeline }
|
||||||
|
impl ::capnp::capability::FromTypelessPipeline for Pipeline {
|
||||||
|
fn new(typeless: ::capnp::any_pointer::Pipeline) -> Pipeline {
|
||||||
|
Pipeline { _typeless: typeless, }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Pipeline {
|
||||||
|
}
|
||||||
|
mod _private {
|
||||||
|
use capnp::private::layout;
|
||||||
|
pub const STRUCT_SIZE: layout::StructSize = layout::StructSize { data: 1, pointers: 0 };
|
||||||
|
pub const TYPE_ID: u64 = 0x9571424bb794dcc2;
|
||||||
|
}
|
||||||
|
}
|
BIN
target/debug/build/capnp_cookbook_2-d0e48217513814f8/build-script-build
Executable file
BIN
target/debug/build/capnp_cookbook_2-d0e48217513814f8/build-script-build
Executable file
Binary file not shown.
Binary file not shown.
BIN
target/debug/capnp_cookbook_2
Executable file
BIN
target/debug/capnp_cookbook_2
Executable file
Binary file not shown.
1
target/debug/capnp_cookbook_2.d
Normal file
1
target/debug/capnp_cookbook_2.d
Normal file
@ -0,0 +1 @@
|
|||||||
|
/home/bspeice/Development/capnp_cookbook_2/target/debug/capnp_cookbook_2: /home/bspeice/Development/capnp_cookbook_2/src/main.rs /home/bspeice/Development/capnp_cookbook_2/target/debug/build/capnp_cookbook_2-a0bfc56364380222/out/point_capnp.rs /home/bspeice/Development/capnp_cookbook_2/build.rs
|
Loading…
Reference in New Issue
Block a user