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