use super::{write_into, Plain, WriteInto};
use std::io;
pub struct Sized<T, S, F>(pub F, pub T)
where
T: WriteInto,
S: WriteInto,
F: FnOnce(usize) -> S;
impl<T, S, F> WriteInto for Sized<T, S, F>
where
T: WriteInto,
S: WriteInto,
F: FnOnce(usize) -> S,
{
type Output = usize;
fn write_into(self, sink: &mut impl io::Write) -> io::Result<Self::Output> {
let mut buffer = Vec::new();
write_into(&mut buffer, self.1)?;
let written = buffer.len();
write_into(sink, (self.0)(written))?;
write_into(sink, Plain(&buffer[..]))?;
Ok(written)
}
}
impl<T, S, F> WriteInto for &Sized<T, S, F>
where
T: Copy + WriteInto,
S: WriteInto,
F: Copy + FnOnce(usize) -> S,
{
type Output = usize;
fn write_into(self, sink: &mut impl io::Write) -> io::Result<Self::Output> {
write_into(sink, Sized(self.0, self.1))
}
}