20
crates/churn-capnp/Cargo.toml
Normal file
20
crates/churn-capnp/Cargo.toml
Normal file
@@ -0,0 +1,20 @@
|
||||
[package]
|
||||
name = "churn-capnp"
|
||||
repository.workspace = true
|
||||
description.workspace = true
|
||||
readme.workspace = true
|
||||
license-file.workspace = true
|
||||
authors.workspace = true
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
publish.workspace = true
|
||||
|
||||
[dependencies]
|
||||
churn-domain.workspace = true
|
||||
uuid.workspace = true
|
||||
anyhow.workspace = true
|
||||
|
||||
capnp = "0.17.2"
|
||||
|
||||
[build-dependencies]
|
||||
capnpc = "0.17.2"
|
10
crates/churn-capnp/build.rs
Normal file
10
crates/churn-capnp/build.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
extern crate capnpc;
|
||||
|
||||
fn main() {
|
||||
capnpc::CompilerCommand::new()
|
||||
.output_path("src/")
|
||||
.src_prefix("schemas/")
|
||||
.file("schemas/models.capnp")
|
||||
.run()
|
||||
.unwrap();
|
||||
}
|
7
crates/churn-capnp/schemas/models.capnp
Normal file
7
crates/churn-capnp/schemas/models.capnp
Normal file
@@ -0,0 +1,7 @@
|
||||
@0xf23adf24ffd8aca4;
|
||||
|
||||
struct LogEvent {
|
||||
id @0 :Text;
|
||||
author @1 :Text;
|
||||
content @2 :Text;
|
||||
}
|
59
crates/churn-capnp/src/lib.rs
Normal file
59
crates/churn-capnp/src/lib.rs
Normal file
@@ -0,0 +1,59 @@
|
||||
use capnp::message::{Builder, HeapAllocator};
|
||||
use capnp::message::{ReaderOptions, TypedReader};
|
||||
use capnp::serialize::{self, OwnedSegments};
|
||||
|
||||
use capnp::traits::{FromPointerReader, Owned};
|
||||
use churn_domain::LogEvent;
|
||||
|
||||
mod models_capnp;
|
||||
|
||||
pub trait CapnpPackExt {
|
||||
type Return;
|
||||
|
||||
fn serialize_capnp(&self) -> String;
|
||||
fn deserialize_capnp(content: &str) -> anyhow::Result<Self::Return>;
|
||||
|
||||
fn capnp_to_string(builder: &Builder<HeapAllocator>) -> String {
|
||||
let msg = serialize::write_message_to_words(builder);
|
||||
std::str::from_utf8(msg.as_slice())
|
||||
.expect("to be able to parse capnp as utf8")
|
||||
.to_string()
|
||||
}
|
||||
|
||||
fn string_to_capnp<'a, S>(content: &'a str) -> TypedReader<OwnedSegments, S>
|
||||
where
|
||||
S: Owned,
|
||||
{
|
||||
let log_event = serialize::read_message(content.as_bytes(), ReaderOptions::new()).unwrap();
|
||||
|
||||
let log_event = log_event.into_typed::<S>();
|
||||
|
||||
log_event
|
||||
}
|
||||
}
|
||||
|
||||
impl CapnpPackExt for LogEvent {
|
||||
type Return = Self;
|
||||
|
||||
fn serialize_capnp(&self) -> String {
|
||||
let mut builder = Builder::new_default();
|
||||
|
||||
let mut log_event = builder.init_root::<models_capnp::log_event::Builder>();
|
||||
log_event.set_id(&self.id.to_string());
|
||||
log_event.set_author(&self.author);
|
||||
log_event.set_content(&self.content);
|
||||
|
||||
Self::capnp_to_string(&builder)
|
||||
}
|
||||
|
||||
fn deserialize_capnp(content: &str) -> anyhow::Result<Self> {
|
||||
let log_event = Self::string_to_capnp::<models_capnp::log_event::Owned>(content);
|
||||
let log_event = log_event.get()?;
|
||||
|
||||
Ok(Self {
|
||||
id: uuid::Uuid::parse_str(log_event.get_id()?)?,
|
||||
author: log_event.get_author()?.into(),
|
||||
content: log_event.get_content()?.into(),
|
||||
})
|
||||
}
|
||||
}
|
288
crates/churn-capnp/src/models_capnp.rs
Normal file
288
crates/churn-capnp/src/models_capnp.rs
Normal file
@@ -0,0 +1,288 @@
|
||||
// @generated by the capnpc-rust plugin to the Cap'n Proto schema compiler.
|
||||
// DO NOT EDIT.
|
||||
// source: models.capnp
|
||||
|
||||
|
||||
pub mod log_event {
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct Owned(());
|
||||
impl ::capnp::introspect::Introspect for Owned { fn introspect() -> ::capnp::introspect::Type { ::capnp::introspect::TypeVariant::Struct(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types, annotation_types: _private::get_annotation_types }).into() } }
|
||||
impl ::capnp::traits::Owned for Owned { type Reader<'a> = Reader<'a>; type Builder<'a> = Builder<'a>; }
|
||||
impl ::capnp::traits::OwnedStruct for Owned { type Reader<'a> = Reader<'a>; type Builder<'a> = Builder<'a>; }
|
||||
impl ::capnp::traits::Pipelined for Owned { type Pipeline = Pipeline; }
|
||||
|
||||
pub struct Reader<'a> { reader: ::capnp::private::layout::StructReader<'a> }
|
||||
impl <'a,> ::core::marker::Copy for Reader<'a,> {}
|
||||
impl <'a,> ::core::clone::Clone for Reader<'a,> {
|
||||
fn clone(&self) -> Self { *self }
|
||||
}
|
||||
|
||||
impl <'a,> ::capnp::traits::HasTypeId for Reader<'a,> {
|
||||
const TYPE_ID: u64 = _private::TYPE_ID;
|
||||
}
|
||||
impl <'a,> ::core::convert::From<::capnp::private::layout::StructReader<'a>> for Reader<'a,> {
|
||||
fn from(reader: ::capnp::private::layout::StructReader<'a>) -> Self {
|
||||
Self { reader, }
|
||||
}
|
||||
}
|
||||
|
||||
impl <'a,> ::core::convert::From<Reader<'a,>> for ::capnp::dynamic_value::Reader<'a> {
|
||||
fn from(reader: Reader<'a,>) -> Self {
|
||||
Self::Struct(::capnp::dynamic_struct::Reader::new(reader.reader, ::capnp::schema::StructSchema::new(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types::<>, annotation_types: _private::get_annotation_types::<>})))
|
||||
}
|
||||
}
|
||||
|
||||
impl <'a,> ::core::fmt::Debug for Reader<'a,> {
|
||||
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::result::Result<(), ::core::fmt::Error> {
|
||||
core::fmt::Debug::fmt(&::core::convert::Into::<::capnp::dynamic_value::Reader<'_>>::into(*self), f)
|
||||
}
|
||||
}
|
||||
|
||||
impl <'a,> ::capnp::traits::FromPointerReader<'a> for Reader<'a,> {
|
||||
fn get_from_pointer(reader: &::capnp::private::layout::PointerReader<'a>, default: ::core::option::Option<&'a [::capnp::Word]>) -> ::capnp::Result<Self> {
|
||||
::core::result::Result::Ok(reader.get_struct(default)?.into())
|
||||
}
|
||||
}
|
||||
|
||||
impl <'a,> ::capnp::traits::IntoInternalStructReader<'a> for Reader<'a,> {
|
||||
fn into_internal_struct_reader(self) -> ::capnp::private::layout::StructReader<'a> {
|
||||
self.reader
|
||||
}
|
||||
}
|
||||
|
||||
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 reborrow(&self) -> Reader<'_,> {
|
||||
Self { .. *self }
|
||||
}
|
||||
|
||||
pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
|
||||
self.reader.total_size()
|
||||
}
|
||||
#[inline]
|
||||
pub fn get_id(self) -> ::capnp::Result<::capnp::text::Reader<'a>> {
|
||||
::capnp::traits::FromPointerReader::get_from_pointer(&self.reader.get_pointer_field(0), ::core::option::Option::None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn has_id(&self) -> bool {
|
||||
!self.reader.get_pointer_field(0).is_null()
|
||||
}
|
||||
#[inline]
|
||||
pub fn get_author(self) -> ::capnp::Result<::capnp::text::Reader<'a>> {
|
||||
::capnp::traits::FromPointerReader::get_from_pointer(&self.reader.get_pointer_field(1), ::core::option::Option::None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn has_author(&self) -> bool {
|
||||
!self.reader.get_pointer_field(1).is_null()
|
||||
}
|
||||
#[inline]
|
||||
pub fn get_content(self) -> ::capnp::Result<::capnp::text::Reader<'a>> {
|
||||
::capnp::traits::FromPointerReader::get_from_pointer(&self.reader.get_pointer_field(2), ::core::option::Option::None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn has_content(&self) -> bool {
|
||||
!self.reader.get_pointer_field(2).is_null()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Builder<'a> { builder: ::capnp::private::layout::StructBuilder<'a> }
|
||||
impl <'a,> ::capnp::traits::HasStructSize for Builder<'a,> {
|
||||
const STRUCT_SIZE: ::capnp::private::layout::StructSize = ::capnp::private::layout::StructSize { data: 0, pointers: 3 };
|
||||
}
|
||||
impl <'a,> ::capnp::traits::HasTypeId for Builder<'a,> {
|
||||
const TYPE_ID: u64 = _private::TYPE_ID;
|
||||
}
|
||||
impl <'a,> ::core::convert::From<::capnp::private::layout::StructBuilder<'a>> for Builder<'a,> {
|
||||
fn from(builder: ::capnp::private::layout::StructBuilder<'a>) -> Self {
|
||||
Self { builder, }
|
||||
}
|
||||
}
|
||||
|
||||
impl <'a,> ::core::convert::From<Builder<'a,>> for ::capnp::dynamic_value::Builder<'a> {
|
||||
fn from(builder: Builder<'a,>) -> Self {
|
||||
Self::Struct(::capnp::dynamic_struct::Builder::new(builder.builder, ::capnp::schema::StructSchema::new(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types::<>, annotation_types: _private::get_annotation_types::<>})))
|
||||
}
|
||||
}
|
||||
|
||||
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) -> Self {
|
||||
builder.init_struct(<Self as ::capnp::traits::HasStructSize>::STRUCT_SIZE).into()
|
||||
}
|
||||
fn get_from_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>, default: ::core::option::Option<&'a [::capnp::Word]>) -> ::capnp::Result<Self> {
|
||||
::core::result::Result::Ok(builder.get_struct(<Self as ::capnp::traits::HasStructSize>::STRUCT_SIZE, default)?.into())
|
||||
}
|
||||
}
|
||||
|
||||
impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
|
||||
fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
|
||||
}
|
||||
|
||||
impl <'a,> Builder<'a,> {
|
||||
pub fn into_reader(self) -> Reader<'a,> {
|
||||
self.builder.into_reader().into()
|
||||
}
|
||||
pub fn reborrow(&mut self) -> Builder<'_,> {
|
||||
Builder { builder: self.builder.reborrow() }
|
||||
}
|
||||
pub fn reborrow_as_reader(&self) -> Reader<'_,> {
|
||||
self.builder.as_reader().into()
|
||||
}
|
||||
|
||||
pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
|
||||
self.builder.as_reader().total_size()
|
||||
}
|
||||
#[inline]
|
||||
pub fn get_id(self) -> ::capnp::Result<::capnp::text::Builder<'a>> {
|
||||
::capnp::traits::FromPointerBuilder::get_from_pointer(self.builder.get_pointer_field(0), ::core::option::Option::None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_id(&mut self, value: ::capnp::text::Reader<'_>) {
|
||||
self.builder.reborrow().get_pointer_field(0).set_text(value);
|
||||
}
|
||||
#[inline]
|
||||
pub fn init_id(self, size: u32) -> ::capnp::text::Builder<'a> {
|
||||
self.builder.get_pointer_field(0).init_text(size)
|
||||
}
|
||||
#[inline]
|
||||
pub fn has_id(&self) -> bool {
|
||||
!self.builder.is_pointer_field_null(0)
|
||||
}
|
||||
#[inline]
|
||||
pub fn get_author(self) -> ::capnp::Result<::capnp::text::Builder<'a>> {
|
||||
::capnp::traits::FromPointerBuilder::get_from_pointer(self.builder.get_pointer_field(1), ::core::option::Option::None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_author(&mut self, value: ::capnp::text::Reader<'_>) {
|
||||
self.builder.reborrow().get_pointer_field(1).set_text(value);
|
||||
}
|
||||
#[inline]
|
||||
pub fn init_author(self, size: u32) -> ::capnp::text::Builder<'a> {
|
||||
self.builder.get_pointer_field(1).init_text(size)
|
||||
}
|
||||
#[inline]
|
||||
pub fn has_author(&self) -> bool {
|
||||
!self.builder.is_pointer_field_null(1)
|
||||
}
|
||||
#[inline]
|
||||
pub fn get_content(self) -> ::capnp::Result<::capnp::text::Builder<'a>> {
|
||||
::capnp::traits::FromPointerBuilder::get_from_pointer(self.builder.get_pointer_field(2), ::core::option::Option::None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn set_content(&mut self, value: ::capnp::text::Reader<'_>) {
|
||||
self.builder.reborrow().get_pointer_field(2).set_text(value);
|
||||
}
|
||||
#[inline]
|
||||
pub fn init_content(self, size: u32) -> ::capnp::text::Builder<'a> {
|
||||
self.builder.get_pointer_field(2).init_text(size)
|
||||
}
|
||||
#[inline]
|
||||
pub fn has_content(&self) -> bool {
|
||||
!self.builder.is_pointer_field_null(2)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Pipeline { _typeless: ::capnp::any_pointer::Pipeline }
|
||||
impl ::capnp::capability::FromTypelessPipeline for Pipeline {
|
||||
fn new(typeless: ::capnp::any_pointer::Pipeline) -> Self {
|
||||
Self { _typeless: typeless, }
|
||||
}
|
||||
}
|
||||
impl Pipeline {
|
||||
}
|
||||
mod _private {
|
||||
pub static ENCODED_NODE: [::capnp::Word; 62] = [
|
||||
::capnp::word(0, 0, 0, 0, 5, 0, 6, 0),
|
||||
::capnp::word(50, 25, 14, 89, 91, 12, 143, 231),
|
||||
::capnp::word(13, 0, 0, 0, 1, 0, 0, 0),
|
||||
::capnp::word(164, 172, 216, 255, 36, 223, 58, 242),
|
||||
::capnp::word(3, 0, 7, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(21, 0, 0, 0, 178, 0, 0, 0),
|
||||
::capnp::word(29, 0, 0, 0, 7, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(25, 0, 0, 0, 175, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(109, 111, 100, 101, 108, 115, 46, 99),
|
||||
::capnp::word(97, 112, 110, 112, 58, 76, 111, 103),
|
||||
::capnp::word(69, 118, 101, 110, 116, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 1, 0, 1, 0),
|
||||
::capnp::word(12, 0, 0, 0, 3, 0, 4, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 1, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(69, 0, 0, 0, 26, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(64, 0, 0, 0, 3, 0, 1, 0),
|
||||
::capnp::word(76, 0, 0, 0, 2, 0, 1, 0),
|
||||
::capnp::word(1, 0, 0, 0, 1, 0, 0, 0),
|
||||
::capnp::word(0, 0, 1, 0, 1, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(73, 0, 0, 0, 58, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(68, 0, 0, 0, 3, 0, 1, 0),
|
||||
::capnp::word(80, 0, 0, 0, 2, 0, 1, 0),
|
||||
::capnp::word(2, 0, 0, 0, 2, 0, 0, 0),
|
||||
::capnp::word(0, 0, 1, 0, 2, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(77, 0, 0, 0, 66, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(72, 0, 0, 0, 3, 0, 1, 0),
|
||||
::capnp::word(84, 0, 0, 0, 2, 0, 1, 0),
|
||||
::capnp::word(105, 100, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(12, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(12, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(97, 117, 116, 104, 111, 114, 0, 0),
|
||||
::capnp::word(12, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(12, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(99, 111, 110, 116, 101, 110, 116, 0),
|
||||
::capnp::word(12, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(12, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
|
||||
];
|
||||
pub fn get_field_types(index: u16) -> ::capnp::introspect::Type {
|
||||
match index {
|
||||
0 => <::capnp::text::Owned as ::capnp::introspect::Introspect>::introspect(),
|
||||
1 => <::capnp::text::Owned as ::capnp::introspect::Introspect>::introspect(),
|
||||
2 => <::capnp::text::Owned as ::capnp::introspect::Introspect>::introspect(),
|
||||
_ => panic!("invalid field index {}", index),
|
||||
}
|
||||
}
|
||||
pub fn get_annotation_types(child_index: Option<u16>, index: u32) -> ::capnp::introspect::Type {
|
||||
panic!("invalid annotation indices ({:?}, {}) ", child_index, index)
|
||||
}
|
||||
pub static RAW_SCHEMA: ::capnp::introspect::RawStructSchema = ::capnp::introspect::RawStructSchema {
|
||||
encoded_node: &ENCODED_NODE,
|
||||
nonunion_members: NONUNION_MEMBERS,
|
||||
members_by_discriminant: MEMBERS_BY_DISCRIMINANT,
|
||||
};
|
||||
pub static NONUNION_MEMBERS : &[u16] = &[0,1,2];
|
||||
pub static MEMBERS_BY_DISCRIMINANT : &[u16] = &[];
|
||||
pub const TYPE_ID: u64 = 0xe78f_0c5b_590e_1932;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user