diff --git a/src/bin/syndicate-server.rs b/src/bin/syndicate-server.rs index 1daa01c..1fdcc86 100644 --- a/src/bin/syndicate-server.rs +++ b/src/bin/syndicate-server.rs @@ -29,8 +29,13 @@ fn translate_sink_err(e: tungstenite::Error) -> packets::EncodeError { fn encode_message(codec: &value::Codec, p: packets::S2C) -> Result { - let v: V = value::to_value(p)?; - Ok(Message::Binary(codec.encode_bytes(&v)?)) + use serde::ser::Serialize; + use preserves::ser::Serializer; + let mut bs = Vec::with_capacity(128); + let mut ser: Serializer<_, V, Syndicate> = + Serializer::new(&mut bs, codec.encode_placeholders.as_ref()); + p.serialize(&mut ser).map_err(|e| std::io::Error::from(e))?; + Ok(Message::Binary(bs)) } fn message_encoder(codec: &value::Codec) diff --git a/src/packets.rs b/src/packets.rs index 84b521c..33165b8 100644 --- a/src/packets.rs +++ b/src/packets.rs @@ -1,8 +1,8 @@ use super::V; use super::Syndicate; -use bytes::{Buf, BytesMut}; -use preserves::value; +use bytes::{Buf, buf::BufMutExt, BytesMut}; +use preserves::{value, ser::Serializer}; use std::io; use std::sync::Arc; use std::marker::PhantomData; @@ -120,14 +120,16 @@ pub struct Codec { pub type ServerCodec = Codec; pub type ClientCodec = Codec; +pub fn standard_preserves_placeholders() -> value::DecodePlaceholderMap { + let mut m = value::Map::new(); + m.insert(0, value::Value::symbol("Discard")); + m.insert(1, value::Value::symbol("Capture")); + m.insert(2, value::Value::symbol("Observe")); + m +} + pub fn standard_preserves_codec() -> value::Codec { - value::Codec::new({ - let mut m = value::Map::new(); - m.insert(0, value::Value::symbol("Discard")); - m.insert(1, value::Value::symbol("Capture")); - m.insert(2, value::Value::symbol("Observe")); - m - }) + value::Codec::new(standard_preserves_placeholders()) } impl Codec { @@ -166,8 +168,9 @@ impl tokio_util::codec::Encoder for Codec Result<(), Self::Error> { - let v: V = value::to_value(&item)?; - bs.extend(self.codec.encode_bytes(&v)?); + let mut w = bs.writer(); + let mut ser: Serializer<_, V, Syndicate> = Serializer::new(&mut w, self.codec.encode_placeholders.as_ref()); + item.serialize(&mut ser).map_err(|e| std::io::Error::from(e))?; Ok(()) } }