write_into/
sized.rs

1use super::{write_into, Plain, WriteInto};
2use std::io;
3
4/// Used to write values prepended with size of their representation.
5///
6/// # Example
7///
8/// ```
9/// use write_into::{Sized, Plain, Uleb128, write_into};
10///
11/// let mut buffer = Vec::new();
12/// let written = write_into(&mut buffer, Sized(Uleb128, Plain("Hello, Sailor!"))).unwrap();
13/// assert_eq!(written, 14);
14/// assert_eq!(&buffer, b"\x0EHello, Sailor!");
15/// ```
16pub struct Sized<T, S, F>(pub F, pub T)
17where
18    T: WriteInto,
19    S: WriteInto,
20    F: FnOnce(usize) -> S;
21
22/// Returns how many bytes was taken by the representation of `T`.
23impl<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
43/// Returns how many bytes was taken by the representation of `T`.
44impl<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}