use core::marker::PhantomData;
use crate::io::Read;
use crate::protocol::{Frame, MaybeVersioned, Versioned, Versionless};
use crate::prelude::*;
#[derive(Clone, Debug)]
pub struct Receiver<E: Into<Error>, R: Read<E>, V: MaybeVersioned> {
reader: R,
_error_marker: PhantomData<E>,
_marker_version: PhantomData<V>,
}
impl<E: Into<Error>, R: Read<E>> Receiver<E, R, Versionless> {
pub fn new<V: MaybeVersioned>(reader: R) -> Receiver<E, R, V> {
Receiver {
reader,
_error_marker: PhantomData,
_marker_version: PhantomData,
}
}
pub fn versionless(reader: R) -> Self {
Receiver::new(reader)
}
pub fn versioned<Version: Versioned>(
reader: R,
#[allow(unused_variables)] version: Version,
) -> Receiver<E, R, Version> {
Receiver::new(reader)
}
}
impl<E: Into<Error>, R: Read<E>, V: MaybeVersioned> Receiver<E, R, V> {
#[inline(always)]
pub fn recv(&mut self) -> Result<Frame<V>> {
Frame::<V>::recv(&mut self.reader).map_err(E::into)
}
}