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