1use std::any::type_name;
2
3pub trait ByteRepr {
16 fn to_le_bytes(&self) -> Vec<u8>;
18
19 fn to_be_bytes(&self) -> Vec<u8>;
21}
22
23macro_rules! impl_byterep {
29 ($t:ty) => {
30 impl ByteRepr for $t {
31 fn to_le_bytes(&self) -> Vec<u8> {
32 <$t>::to_le_bytes(*self).to_vec()
33 }
34 fn to_be_bytes(&self) -> Vec<u8> {
35 <$t>::to_be_bytes(*self).to_vec()
36 }
37 }
38 };
39}
40
41impl_byterep!(i8);
43impl_byterep!(u16);
44impl_byterep!(u32);
45
46pub fn represent<T>(value: &T)
73where
74 T: std::fmt::Display + std::fmt::Binary + Copy,
75 T: ByteRepr,
76{
77 println!(
78 "\n\nHello, Representing in following formats for: {} \x1b[33m({})\x1b[0m",
79 value,
80 type_name::<T>()
81 );
82
83 println!(
85 "\x1b[31m Binary representation : {:b} \x1b[0m",
86 value
87 );
88
89 println!(
91 "\x1b[32m Little-endian byte array : {:?} \x1b[0m",
92 value.to_le_bytes()
93 );
94 println!(
95 "\x1b[33m Hex memory (LE) with 2-digit zero padding : {:02x?} \x1b[0m",
96 value.to_le_bytes()
97 );
98
99 println!(
101 "\x1b[34m Big-endian byte array : {:?} \x1b[0m",
102 value.to_be_bytes()
103 );
104 println!(
105 "\x1b[35m Hex memory (BE) with 2-digit zero padding : {:02x?} \x1b[0m",
106 value.to_be_bytes()
107 );
108}
109
110#[cfg(test)]
111mod tests {
112 use super::*;
113
114 #[test]
115 fn test_byte_repr_trait_for_i8() {
116 let val: i8 = 0x12;
117 let expected_le = val.to_le_bytes().to_vec();
118 let expected_be = val.to_be_bytes().to_vec();
119 assert_eq!(ByteRepr::to_le_bytes(&val), expected_le);
120 assert_eq!(ByteRepr::to_be_bytes(&val), expected_be);
121 }
122 #[test]
123 fn test_byte_repr_trait_for_i8_negetive_127() {
124 let val: i8 = -127;
125 let expected_le = val.to_le_bytes().to_vec();
126 let expected_be = val.to_be_bytes().to_vec();
127 assert_eq!(ByteRepr::to_le_bytes(&val), expected_le);
128 assert_eq!(ByteRepr::to_be_bytes(&val), expected_be);
129 }
130 #[test]
131 fn test_byte_repr_trait_for_u16() {
132 let val: u16 = 0x1234;
133 let expected_le = val.to_le_bytes().to_vec();
134 let expected_be = val.to_be_bytes().to_vec();
135 assert_eq!(ByteRepr::to_le_bytes(&val), expected_le);
136 assert_eq!(ByteRepr::to_be_bytes(&val), expected_be);
137 }
138
139 #[test]
140 fn test_byte_repr_trait_for_u32() {
141 let val: u32 = 0x123456;
142 let expected_le = val.to_le_bytes().to_vec();
143 let expected_be = val.to_be_bytes().to_vec();
144 assert_eq!(ByteRepr::to_le_bytes(&val), expected_le);
145 assert_eq!(ByteRepr::to_be_bytes(&val), expected_be);
146 }
147
148 #[test]
149 fn test_represent_does_not_panic() {
150 let val: i8 = 127;
151 represent(&val);
152 let val: i8 = -127;
153 represent(&val);
154 let val: u16 = 65535;
155 represent(&val);
156 let val: u32 = 4294967295;
157 represent(&val);
158 }
159}