1use crate::{Endianness, WriteEndianness, WriteRef};
2use std::io::{Result, Write};
3
4pub trait TypedWrite: Write + Sized {
5 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 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}