mls_rs_codec/
vec.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// Copyright by contributors to this project.
3// SPDX-License-Identifier: (Apache-2.0 OR MIT)
4
5use alloc::vec::Vec;
6
7use crate::{MlsDecode, MlsEncode, MlsSize};
8
9impl<T> MlsSize for [T]
10where
11    T: MlsSize,
12{
13    fn mls_encoded_len(&self) -> usize {
14        crate::iter::mls_encoded_len(self.iter())
15    }
16}
17
18impl<T> MlsSize for Vec<T>
19where
20    T: MlsSize,
21{
22    #[inline]
23    fn mls_encoded_len(&self) -> usize {
24        self.as_slice().mls_encoded_len()
25    }
26}
27
28impl<T> MlsEncode for [T]
29where
30    T: MlsEncode,
31{
32    fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
33        crate::iter::mls_encode(self.iter(), writer)
34    }
35}
36
37impl<T> MlsEncode for Vec<T>
38where
39    T: MlsEncode,
40{
41    #[inline]
42    fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
43        self.as_slice().mls_encode(writer)
44    }
45}
46
47impl<T> MlsDecode for Vec<T>
48where
49    T: MlsDecode,
50{
51    fn mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error> {
52        crate::iter::mls_decode_collection(reader, |data| {
53            let mut items = Vec::new();
54
55            while !data.is_empty() {
56                items.push(T::mls_decode(data)?);
57            }
58
59            Ok(items)
60        })
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use crate::{Error, MlsDecode, MlsEncode};
67    use alloc::{vec, vec::Vec};
68    use assert_matches::assert_matches;
69
70    #[cfg(target_arch = "wasm32")]
71    use wasm_bindgen_test::wasm_bindgen_test as test;
72
73    #[test]
74    fn serialization_works() {
75        assert_eq!(
76            vec![3, 1, 2, 3],
77            vec![1u8, 2, 3].mls_encode_to_vec().unwrap()
78        );
79    }
80
81    #[test]
82    fn data_round_trips() {
83        let val = vec![1u8, 2, 3];
84        let x = val.mls_encode_to_vec().unwrap();
85        assert_eq!(val, Vec::mls_decode(&mut &*x).unwrap());
86    }
87
88    #[test]
89    fn empty_vec_can_be_deserialized() {
90        assert_eq!(Vec::<u8>::new(), Vec::mls_decode(&mut &[0u8][..]).unwrap());
91    }
92
93    #[test]
94    fn too_few_items_to_deserialize_gives_an_error() {
95        assert_matches!(
96            Vec::<u8>::mls_decode(&mut &[2, 3][..]),
97            Err(Error::UnexpectedEOF)
98        );
99    }
100}