volans-codec 0.2.1

Codec for Volans networking framework
Documentation
mod json;
mod protobuf;

pub use json::JsonUviCodec;
pub use protobuf::ProtobufUviCodec;

pub use asynchronous_codec::*;
pub use prost;

pub struct CombinedCodec<TEncoder, TDecoder>
where
    TEncoder: Encoder,
    TDecoder: Decoder,
{
    encoder: TEncoder,
    decoder: TDecoder,
}

impl<TEncoder, TDecoder> Encoder for CombinedCodec<TEncoder, TDecoder>
where
    TEncoder: Encoder,
    TDecoder: Decoder,
{
    type Item<'a> = TEncoder::Item<'a>;
    type Error = TEncoder::Error;

    fn encode(&mut self, item: Self::Item<'_>, dst: &mut BytesMut) -> Result<(), Self::Error> {
        self.encoder.encode(item, dst)
    }
}

impl<TEncoder, TDecoder> Decoder for CombinedCodec<TEncoder, TDecoder>
where
    TEncoder: Encoder,
    TDecoder: Decoder,
{
    type Item = TDecoder::Item;
    type Error = TDecoder::Error;

    fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
        self.decoder.decode(src)
    }
}

impl<TEncoder, TDecoder> Clone for CombinedCodec<TEncoder, TDecoder>
where
    TEncoder: Encoder + Clone,
    TDecoder: Decoder + Clone,
{
    fn clone(&self) -> Self {
        CombinedCodec {
            encoder: self.encoder.clone(),
            decoder: self.decoder.clone(),
        }
    }
}

impl<TEncoder, TDecoder> Default for CombinedCodec<TEncoder, TDecoder>
where
    TEncoder: Encoder + Default,
    TDecoder: Decoder + Default,
{
    fn default() -> Self {
        CombinedCodec {
            encoder: TEncoder::default(),
            decoder: TDecoder::default(),
        }
    }
}

impl<TEncoder, TDecoder> CombinedCodec<TEncoder, TDecoder>
where
    TEncoder: Encoder,
    TDecoder: Decoder,
{
    pub fn new(encoder: TEncoder, decoder: TDecoder) -> Self {
        CombinedCodec { encoder, decoder }
    }

    pub fn encoder(&self) -> &TEncoder {
        &self.encoder
    }

    pub fn decoder(&self) -> &TDecoder {
        &self.decoder
    }

    pub fn encoder_mut(&mut self) -> &mut TEncoder {
        &mut self.encoder
    }

    pub fn decoder_mut(&mut self) -> &mut TDecoder {
        &mut self.decoder
    }
}