mls_rs_codec/
stdint.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// Copyright by contributors to this project.
// SPDX-License-Identifier: (Apache-2.0 OR MIT)

use crate::{MlsDecode, MlsEncode, MlsSize};
use alloc::vec::Vec;

macro_rules! impl_stdint {
    ($t:ty) => {
        impl MlsSize for $t {
            fn mls_encoded_len(&self) -> usize {
                core::mem::size_of::<$t>()
            }
        }

        impl MlsEncode for $t {
            fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
                writer.extend(self.to_be_bytes());
                Ok(())
            }
        }

        impl MlsDecode for $t {
            fn mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error> {
                MlsDecode::mls_decode(reader).map(<$t>::from_be_bytes)
            }
        }
    };
}

impl_stdint!(u8);
impl_stdint!(u16);
impl_stdint!(u32);
impl_stdint!(u64);
impl_stdint!(u128);

#[cfg(test)]
mod tests {
    #[cfg(target_arch = "wasm32")]
    use wasm_bindgen_test::wasm_bindgen_test as test;

    use crate::{MlsDecode, MlsEncode};

    use alloc::vec;

    #[test]
    fn u8_round_trip() {
        let serialized = 42u8.mls_encode_to_vec().unwrap();
        assert_eq!(serialized, vec![42u8]);

        let recovered = u8::mls_decode(&mut &*serialized).unwrap();

        assert_eq!(recovered, 42u8);
    }

    #[test]
    fn u16_round_trip() {
        let serialized = 1024u16.mls_encode_to_vec().unwrap();
        assert_eq!(serialized, vec![4, 0]);

        let recovered = u16::mls_decode(&mut &*serialized).unwrap();

        assert_eq!(recovered, 1024u16);
    }

    #[test]
    fn u32_round_trip() {
        let serialized = 1000000u32.mls_encode_to_vec().unwrap();
        assert_eq!(serialized, vec![0, 15, 66, 64]);

        let recovered = u32::mls_decode(&mut &*serialized).unwrap();

        assert_eq!(recovered, 1000000u32);
    }

    #[test]
    fn u64_round_trip() {
        let serialized = 100000000000u64.mls_encode_to_vec().unwrap();
        assert_eq!(serialized, vec![0, 0, 0, 23, 72, 118, 232, 0]);

        let recovered = u64::mls_decode(&mut &*serialized).unwrap();

        assert_eq!(recovered, 100000000000u64);
    }

    #[test]
    fn u128_round_trip() {
        let serialized = 10000000000000000u128.mls_encode_to_vec().unwrap();
        assert_eq!(
            serialized,
            vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 134, 242, 111, 193, 0, 0]
        );

        let recovered = u128::mls_decode(&mut &*serialized).unwrap();

        assert_eq!(recovered, 10000000000000000u128);
    }
}