1use super::{write_into, Plain, WriteInto};
2use std::io;
3
4pub struct Sized<T, S, F>(pub F, pub T)
17where
18 T: WriteInto,
19 S: WriteInto,
20 F: FnOnce(usize) -> S;
21
22impl<T, S, F> WriteInto for Sized<T, S, F>
24where
25 T: WriteInto,
26 S: WriteInto,
27 F: FnOnce(usize) -> S,
28{
29 type Output = usize;
30
31 fn write_into(self, sink: &mut impl io::Write) -> io::Result<Self::Output> {
32 let mut buffer = Vec::new();
33 write_into(&mut buffer, self.1)?;
34 let written = buffer.len();
35
36 write_into(sink, (self.0)(written))?;
37 write_into(sink, Plain(&buffer[..]))?;
38
39 Ok(written)
40 }
41}
42
43impl<T, S, F> WriteInto for &Sized<T, S, F>
45where
46 T: Copy + WriteInto,
47 S: WriteInto,
48 F: Copy + FnOnce(usize) -> S,
49{
50 type Output = usize;
51
52 fn write_into(self, sink: &mut impl io::Write) -> io::Result<Self::Output> {
53 write_into(sink, Sized(self.0, self.1))
54 }
55}