acursor/
write.rs

1use concat_idents::concat_idents;
2use std::{
3    any::type_name,
4    io::{self, Write},
5};
6
7macro_rules! generate_write_number {
8    ($type:ty) => {
9        concat_idents!(fn_name = write_, $type {
10            /// # Examples
11            ///
12            /// ```
13            /// let mut cursor: Cursor<Vec<u8>> = Cursor::new(Vec::new());
14            #[doc = concat!("cursor.write_", stringify!($type), "(100).unwrap();")]
15            ///
16            #[doc = concat!("println!(\"My number: {:?}\", cursor.read_", stringify!($type), "().unwrap());")]
17            /// ```
18            fn fn_name(&mut self, number: $type) -> Result<(), io::Error> {
19                self.write_all(&number.to_be_bytes())?;
20
21                Ok(())
22            }
23        });
24    };
25}
26
27macro_rules! generate_write_float {
28    ($type:ty) => {
29        concat_idents!(fn_name = write_, $type {
30            /// # Examples
31            ///
32            /// ```
33            /// let mut cursor: Cursor<Vec<u8>> = Cursor::new(Vec::new());
34            #[doc = concat!("cursor.write_", stringify!($type), "(100.0).unwrap();")]
35            ///
36            #[doc = concat!("println!(\"My number: {:?}\", cursor.read_", stringify!($type), "().unwrap());")]
37            /// ```
38            fn fn_name(&mut self, number: $type) -> Result<(), io::Error> {
39                self.write_all(&number.to_be_bytes())?;
40
41                Ok(())
42            }
43        });
44    };
45}
46
47pub trait WriteBytes: Write {
48    generate_write_number!(u8);
49    generate_write_number!(i8);
50    generate_write_number!(u16);
51    generate_write_number!(i16);
52    generate_write_number!(u32);
53    generate_write_number!(i32);
54    generate_write_number!(u64);
55    generate_write_number!(i64);
56    generate_write_number!(u128);
57    generate_write_number!(i128);
58
59    generate_write_float!(f32);
60    generate_write_float!(f64);
61
62    /// # Examples
63    ///
64    /// ```
65    /// let mut cursor: Cursor<Vec<u8>> = Cursor::new(Vec::new());
66    /// cursor.write_string::<u8>("Hello".to_string()).unwrap();
67    ///
68    /// println!("My string: {:?}", cursor.read_string::<u8>().unwrap());
69    /// ```
70    fn write_string<T>(&mut self, string: String) -> Result<(), io::Error> {
71        match type_name::<T>() {
72            "u8" => self.write_u8(string.len().try_into().unwrap())?,
73            "u16" => self.write_u16(string.len().try_into().unwrap())?,
74            "u32" => self.write_u32(string.len().try_into().unwrap())?,
75            _ => unimplemented!(),
76        };
77
78        self.write_all(string.as_bytes())?;
79
80        Ok(())
81    }
82}
83
84impl<R: Write + ?Sized> WriteBytes for R {}