syndicate-rs/src/packets.rs

133 lines
3.5 KiB
Rust
Raw Normal View History

2019-10-16 15:47:56 +00:00
use super::V;
2019-10-22 21:37:37 +00:00
use super::Syndicate;
2019-10-16 15:47:56 +00:00
2020-05-24 19:18:48 +00:00
use bytes::{Buf, buf::BufMutExt, BytesMut};
2020-05-25 13:40:28 +00:00
use preserves::{value, ser::Serializer};
2019-10-16 15:47:56 +00:00
use std::io;
2019-10-22 21:37:37 +00:00
use std::sync::Arc;
2020-05-11 20:02:43 +00:00
use std::marker::PhantomData;
2019-10-16 15:47:56 +00:00
pub type EndpointName = V;
pub type Assertion = V;
2019-10-22 21:37:37 +00:00
pub type Captures = Arc<Vec<Assertion>>;
2019-10-16 15:47:56 +00:00
2020-05-11 20:02:43 +00:00
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
2019-10-16 15:47:56 +00:00
pub enum Action {
Assert(EndpointName, Assertion),
Clear(EndpointName),
Message(Assertion),
}
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
pub enum Event {
Add(EndpointName, Captures),
Del(EndpointName, Captures),
Msg(EndpointName, Captures),
End(EndpointName),
}
2020-05-11 20:02:43 +00:00
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
2020-05-11 20:08:27 +00:00
pub enum C2S {
2019-10-16 15:47:56 +00:00
Connect(V),
Turn(Vec<Action>),
Ping(),
Pong(),
}
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
2020-05-11 20:08:27 +00:00
pub enum S2C {
Err(String, V),
2019-10-16 15:47:56 +00:00
Turn(Vec<Event>),
Ping(),
Pong(),
}
//---------------------------------------------------------------------------
#[derive(Debug)]
pub enum DecodeError {
2020-05-25 13:40:28 +00:00
Read(io::Error),
2020-05-25 14:13:11 +00:00
Parse(value::de::error::Error<Syndicate>, V),
2019-10-16 15:47:56 +00:00
}
impl From<io::Error> for DecodeError {
fn from(v: io::Error) -> Self {
DecodeError::Read(v.into())
}
}
2020-05-11 21:31:00 +00:00
impl std::fmt::Display for DecodeError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl std::error::Error for DecodeError {
}
2019-10-16 15:47:56 +00:00
//---------------------------------------------------------------------------
2020-05-11 20:02:43 +00:00
pub struct Codec<InT, OutT> {
2019-10-22 21:37:37 +00:00
codec: value::Codec<V, Syndicate>,
2020-05-11 20:02:43 +00:00
ph_in: PhantomData<InT>,
ph_out: PhantomData<OutT>,
2019-10-16 15:47:56 +00:00
}
pub type ServerCodec = Codec<C2S, S2C>;
pub type ClientCodec = Codec<S2C, C2S>;
2020-05-24 19:18:48 +00:00
pub fn standard_preserves_placeholders() -> value::DecodePlaceholderMap<V, Syndicate> {
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<V, Syndicate> {
2020-05-24 19:18:48 +00:00
value::Codec::new(standard_preserves_placeholders())
}
2020-05-11 20:02:43 +00:00
impl<InT, OutT> Codec<InT, OutT> {
2019-10-22 21:37:37 +00:00
pub fn new(codec: value::Codec<V, Syndicate>) -> Self {
2020-05-11 20:02:43 +00:00
Codec { codec, ph_in: PhantomData, ph_out: PhantomData }
}
pub fn standard() -> Self {
Self::new(standard_preserves_codec())
2019-10-16 15:47:56 +00:00
}
}
2020-05-11 20:02:43 +00:00
impl<InT: serde::de::DeserializeOwned, OutT> tokio_util::codec::Decoder for Codec<InT, OutT> {
type Item = InT;
2019-10-16 15:47:56 +00:00
type Error = DecodeError;
fn decode(&mut self, bs: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
let mut buf = &bs[..];
let orig_len = buf.len();
2020-05-25 13:04:50 +00:00
let mut d = self.codec.decoder(&mut buf);
match d.next() {
None => Ok(None),
Some(res) => {
let v = res?;
let final_len = buf.len();
2020-05-25 13:40:28 +00:00
bs.advance(orig_len - final_len);
match value::from_value(&v) {
Ok(p) => Ok(Some(p)),
Err(e) => Err(DecodeError::Parse(e, v))
}
2019-10-17 14:41:42 +00:00
}
2019-10-16 15:47:56 +00:00
}
}
}
2020-05-11 20:02:43 +00:00
impl<InT, OutT: serde::Serialize> tokio_util::codec::Encoder<OutT> for Codec<InT, OutT>
2020-05-06 15:14:05 +00:00
{
2020-05-25 14:13:11 +00:00
type Error = io::Error;
2020-05-11 20:02:43 +00:00
fn encode(&mut self, item: OutT, bs: &mut BytesMut) -> Result<(), Self::Error> {
2020-05-24 19:18:48 +00:00
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))?;
2019-10-16 15:47:56 +00:00
Ok(())
}
}