1use crate::{MlsDecode, MlsEncode, MlsSize};
6use alloc::vec::Vec;
7
8macro_rules! impl_stdint {
9 ($t:ty) => {
10 impl MlsSize for $t {
11 fn mls_encoded_len(&self) -> usize {
12 core::mem::size_of::<$t>()
13 }
14 }
15
16 impl MlsEncode for $t {
17 fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
18 writer.extend(self.to_be_bytes());
19 Ok(())
20 }
21 }
22
23 impl MlsDecode for $t {
24 fn mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error> {
25 MlsDecode::mls_decode(reader).map(<$t>::from_be_bytes)
26 }
27 }
28 };
29}
30
31impl_stdint!(u8);
32impl_stdint!(u16);
33impl_stdint!(u32);
34impl_stdint!(u64);
35impl_stdint!(u128);
36
37#[cfg(test)]
38mod tests {
39 #[cfg(target_arch = "wasm32")]
40 use wasm_bindgen_test::wasm_bindgen_test as test;
41
42 use crate::{MlsDecode, MlsEncode};
43
44 use alloc::vec;
45
46 #[test]
47 fn u8_round_trip() {
48 let serialized = 42u8.mls_encode_to_vec().unwrap();
49 assert_eq!(serialized, vec![42u8]);
50
51 let recovered = u8::mls_decode(&mut &*serialized).unwrap();
52
53 assert_eq!(recovered, 42u8);
54 }
55
56 #[test]
57 fn u16_round_trip() {
58 let serialized = 1024u16.mls_encode_to_vec().unwrap();
59 assert_eq!(serialized, vec![4, 0]);
60
61 let recovered = u16::mls_decode(&mut &*serialized).unwrap();
62
63 assert_eq!(recovered, 1024u16);
64 }
65
66 #[test]
67 fn u32_round_trip() {
68 let serialized = 1000000u32.mls_encode_to_vec().unwrap();
69 assert_eq!(serialized, vec![0, 15, 66, 64]);
70
71 let recovered = u32::mls_decode(&mut &*serialized).unwrap();
72
73 assert_eq!(recovered, 1000000u32);
74 }
75
76 #[test]
77 fn u64_round_trip() {
78 let serialized = 100000000000u64.mls_encode_to_vec().unwrap();
79 assert_eq!(serialized, vec![0, 0, 0, 23, 72, 118, 232, 0]);
80
81 let recovered = u64::mls_decode(&mut &*serialized).unwrap();
82
83 assert_eq!(recovered, 100000000000u64);
84 }
85
86 #[test]
87 fn u128_round_trip() {
88 let serialized = 10000000000000000u128.mls_encode_to_vec().unwrap();
89 assert_eq!(
90 serialized,
91 vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 134, 242, 111, 193, 0, 0]
92 );
93
94 let recovered = u128::mls_decode(&mut &*serialized).unwrap();
95
96 assert_eq!(recovered, 10000000000000000u128);
97 }
98}