use crate::utils::*;
use std::io;
use std::marker::PhantomData;
pub mod fast;
pub mod json;
pub mod sofh;
pub mod tagvalue;
pub trait StreamingDecoder<M>
where
Self: Sized,
{
type Error;
fn supply_buffer(&mut self) -> &mut [u8];
fn attempt_decoding(&mut self) -> Result<Option<&M>, Self::Error>;
fn get(&self) -> &M {
unimplemented!()
}
fn frames_streamiter<R>(self, reader: R) -> Frames<Self, R, M, Self::Error>
where
R: io::Read,
{
Frames {
decoder: self,
source: reader,
message: PhantomData::default(),
err: None,
}
}
}
pub trait Decoder<M> {
type Error;
fn decode(&mut self, data: &[u8]) -> Result<&M, Self::Error>;
}
pub trait Encoder<M> {
type Error;
fn encode(&mut self, buffer: impl Buffer, message: &M) -> Result<usize, Self::Error>;
fn encode_to_vec(&mut self, message: &M) -> Result<Vec<u8>, Self::Error> {
let mut buffer = Vec::<u8>::new();
self.encode(&mut buffer, message)?;
Ok(buffer.as_slice().iter().cloned().collect())
}
}
#[derive(Debug)]
pub struct Frames<D, R, M, E> {
decoder: D,
source: R,
message: PhantomData<M>,
err: Option<FramelessError<E>>,
}
impl<D, R, M, E> Frames<D, R, M, E>
where
M: Sized,
D: StreamingDecoder<M, Error = E>,
R: io::Read,
{
pub fn next(&mut self) -> Result<Option<&M>, &FramelessError<E>> {
loop {
let mut buffer = self.decoder.supply_buffer();
if let Err(e) = self.source.read(&mut buffer) {
self.err = Some(e.into());
break;
}
match self.decoder.attempt_decoding() {
Ok(Some(_)) => break,
Ok(None) => (),
Err(e) => {
self.err = Some(FramelessError::Decoder(e));
break;
}
}
}
match self.err {
Some(ref err) => Err(err),
None => Ok(Some(self.decoder.get())),
}
}
}
#[derive(Debug)]
pub enum FramelessError<E> {
Decoder(E),
Io(io::Error),
}
impl<T> From<io::Error> for FramelessError<T> {
fn from(err: io::Error) -> Self {
FramelessError::Io(err)
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Poll {
Ready,
Incomplete,
}