use super::V; use bytes::{Buf, buf::BufMutExt, BytesMut}; use std::sync::Arc; use std::marker::PhantomData; use preserves::{ de::Deserializer, error, ser::to_writer, value::reader::from_bytes, }; pub type EndpointName = V; pub type Assertion = V; pub type Captures = Arc>; #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] 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), } #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] pub enum C2S { Connect(V), Turn(Vec), Ping(), Pong(), } #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] pub enum S2C { Err(String, V), Turn(Vec), Ping(), Pong(), } //--------------------------------------------------------------------------- pub type Error = error::Error; pub struct Codec { ph_in: PhantomData, ph_out: PhantomData, } pub type ServerCodec = Codec; pub type ClientCodec = Codec; impl Codec { pub fn new() -> Self { Codec { ph_in: PhantomData, ph_out: PhantomData } } } impl tokio_util::codec::Decoder for Codec { type Item = InT; type Error = Error; fn decode(&mut self, bs: &mut BytesMut) -> Result, Self::Error> { let mut r = from_bytes(bs); let mut d = Deserializer::from_reader(&mut r); match Self::Item::deserialize(&mut d) { Err(e) if error::is_eof_error(&e) => Ok(None), Err(e) => Err(e), Ok(item) => { let count = d.read.source.index; bs.advance(count); Ok(Some(item)) } } } } impl tokio_util::codec::Encoder for Codec { type Error = Error; fn encode(&mut self, item: OutT, bs: &mut BytesMut) -> Result<(), Self::Error> { to_writer(&mut bs.writer(), &item) } }