use core::marker::PhantomData;
use crate::codec_prelude::*;
pub fn encoder<C, T>(consumer: C) -> Encoder<C, T> {
Encoder::new(consumer)
}
pub struct Encoder<C, T> {
inner: C,
phantom: PhantomData<T>,
}
impl<C, T> Encoder<C, T> {
fn new(consumer: C) -> Self {
Self {
inner: consumer,
phantom: PhantomData,
}
}
pub fn into_inner(self) -> C {
self.inner
}
}
impl<C, T, Symbol> Consumer for Encoder<C, T>
where
C: BulkConsumer<Item = Symbol>,
T: Encodable<Symbol>,
{
type Item = T;
type Final = C::Final;
type Error = C::Error;
async fn consume(&mut self, value: Either<Self::Item, Self::Final>) -> Result<(), Self::Error> {
match value {
Left(item) => self.inner.consume_encoded(&item).await,
Right(fin) => self.inner.consume_final(fin).await,
}
}
async fn flush(&mut self) -> Result<(), Self::Error> {
self.inner.flush().await
}
}