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 #[doc = concat!("cursor.write_", stringify!($type), "(100).unwrap();")]
15 #[doc = concat!("println!(\"My number: {:?}\", cursor.read_", stringify!($type), "().unwrap());")]
17 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 #[doc = concat!("cursor.write_", stringify!($type), "(100.0).unwrap();")]
35 #[doc = concat!("println!(\"My number: {:?}\", cursor.read_", stringify!($type), "().unwrap());")]
37 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 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 {}