use crate::fse::FseBackend;
use crate::ring::RingShortWriter;
use super::constants::*;
use super::frontend_ring::FrontendRing;
use std::fmt;
use std::io::{self, Write};
pub struct LzfseWriter<'a, O> {
frontend: FrontendRing<'a, Input>,
backend: &'a mut FseBackend,
writer: RingShortWriter<'a, O, Output>,
}
impl<'a, O> LzfseWriter<'a, O> {
#[inline(always)]
pub(super) fn new(
frontend: FrontendRing<'a, Input>,
backend: &'a mut FseBackend,
writer: RingShortWriter<'a, O, Output>,
) -> Self {
Self { frontend, backend, writer }
}
}
impl<'a, O: Write> LzfseWriter<'a, O> {
pub fn finalize(mut self) -> io::Result<O> {
self.frontend.flush(self.backend, &mut self.writer)?;
self.writer.into_inner().map_err(Into::into).map(|u| u.0)
}
}
impl<'a, O: Write> Write for LzfseWriter<'a, O> {
#[inline(always)]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.frontend.write(self.backend, buf, &mut self.writer)
}
#[inline(always)]
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
impl<'a, O> fmt::Debug for LzfseWriter<'a, O> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("LzfseWriter").finish()
}
}