use core::marker::PhantomData;
use crate::io::AsyncWrite;
use crate::protocol::{Frame, MaybeVersioned, Versioned, Versionless};
use crate::prelude::*;
#[derive(Clone, Debug)]
pub struct AsyncSender<E: Into<Error>, W: AsyncWrite<E>, V: MaybeVersioned> {
writer: W,
_error_marker: PhantomData<E>,
_marker_version: PhantomData<V>,
}
impl<E: Into<Error>, W: AsyncWrite<E>> AsyncSender<E, W, Versionless> {
pub fn new<V: MaybeVersioned>(writer: W) -> AsyncSender<E, W, V> {
AsyncSender {
writer,
_error_marker: PhantomData,
_marker_version: PhantomData,
}
}
pub fn versionless(writer: W) -> Self {
AsyncSender::new(writer)
}
pub fn versioned<Version: Versioned>(
writer: W,
#[allow(unused_variables)] version: Version,
) -> AsyncSender<E, W, Version> {
AsyncSender::new(writer)
}
}
impl<E: Into<Error>, W: AsyncWrite<E>, V: MaybeVersioned> AsyncSender<E, W, V> {
#[inline(always)]
pub async fn send(&mut self, frame: &Frame<V>) -> Result<usize> {
V::expect(frame.version())?;
frame.send_async(&mut self.writer).await.map_err(E::into)
}
#[inline]
pub async fn flush(&mut self) -> Result<()> {
self.writer.flush().await.map_err(E::into)
}
}