typed_io/
typed_write.rs

1use crate::{Endianness, WriteEndianness, WriteRef};
2use std::io::{Result, Write};
3
4pub trait TypedWrite: Write + Sized {
5    // WriteEndianness
6    fn write_endian_with_callback<F, T: WriteEndianness>(
7        &mut self,
8        n: T,
9        callback: F,
10        endianness: Endianness,
11    ) -> Result<()>
12    where
13        F: Fn(&mut [u8]),
14    {
15        n.write_endianness_with_callback(self, callback, endianness)
16    }
17    fn write_be<T: WriteEndianness>(&mut self, n: T) -> Result<()> {
18        n.write_be_bytes(self)
19    }
20    fn write_le<T: WriteEndianness>(&mut self, n: T) -> Result<()> {
21        n.write_le_bytes(self)
22    }
23    fn write_ne<T: WriteEndianness>(&mut self, n: T) -> Result<()> {
24        n.write_ne_bytes(self)
25    }
26
27    // WriteRef
28    fn write_ref_with_callback<F, T: WriteRef>(&mut self, n: T, callback: F) -> Result<()>
29    where
30        F: Fn(&[u8]),
31    {
32        n.write_ref_bytes_with_callback(self, callback)
33    }
34    fn write_ref<T: WriteRef + ?Sized>(&mut self, n: &T) -> Result<()> {
35        n.write_ref_bytes(self)
36    }
37}
38
39impl<W: Write> TypedWrite for W {}
40
41#[cfg(test)]
42mod tests {
43    use super::TypedWrite;
44    use std::io;
45
46    #[test]
47    fn write_string() -> io::Result<()> {
48        let mut v = Vec::new();
49        v.write_ref("bkbkb")?;
50
51        assert_eq!(v, [98, 107, 98, 107, 98]);
52
53        Ok(())
54    }
55
56    #[test]
57    fn write_unsigned_integer_type() -> io::Result<()> {
58        let mut v = Vec::new();
59
60        v.write_le(1_u8)?;
61        v.write_le(2_u16)?;
62        v.write_le(3_u32)?;
63        v.write_le(4_u64)?;
64        v.write_be(5_u128)?;
65
66        assert_eq!(
67            v,
68            [
69                1, 2, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
70                0, 0, 5,
71            ]
72        );
73
74        Ok(())
75    }
76}