tocket 0.2.1

A implemetation of 'Token Bucket' algorithm
Documentation
use crate::distributed::message::Message;
use crate::error::DistributedStorageError;

use borsh::BorshDeserialize;
use bytes::{BufMut, BytesMut};
use tokio_util::codec::{Decoder, Encoder};

#[derive(Debug, Default)]
pub struct Codec(());

impl Encoder<Message> for Codec {
    type Error = DistributedStorageError;

    fn encode(&mut self, item: Message, dst: &mut BytesMut) -> Result<(), Self::Error> {
        let enc = borsh::to_vec(&item)?;
        dst.reserve(enc.len());
        dst.put_slice(&enc);
        Ok(())
    }
}

impl Decoder for Codec {
    type Item = Message;
    type Error = DistributedStorageError;

    fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
        if !src.is_empty() {
            let len = src.len();
            let buf = src.split_to(len);
            let item = <Message as BorshDeserialize>::try_from_slice(&buf)?;
            item.check_checksum()?;
            Ok(Some(item))
        } else {
            Ok(None)
        }
    }
}