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 
5 use alloc::vec::Vec;
6 
7 use crate::{MlsDecode, MlsEncode, MlsSize};
8 
9 impl<T> MlsSize for [T]
10 where
11     T: MlsSize,
12 {
mls_encoded_len(&self) -> usize13     fn mls_encoded_len(&self) -> usize {
14         crate::iter::mls_encoded_len(self.iter())
15     }
16 }
17 
18 impl<T> MlsSize for Vec<T>
19 where
20     T: MlsSize,
21 {
22     #[inline]
mls_encoded_len(&self) -> usize23     fn mls_encoded_len(&self) -> usize {
24         self.as_slice().mls_encoded_len()
25     }
26 }
27 
28 impl<T> MlsEncode for [T]
29 where
30     T: MlsEncode,
31 {
mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error>32     fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
33         crate::iter::mls_encode(self.iter(), writer)
34     }
35 }
36 
37 impl<T> MlsEncode for Vec<T>
38 where
39     T: MlsEncode,
40 {
41     #[inline]
mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error>42     fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
43         self.as_slice().mls_encode(writer)
44     }
45 }
46 
47 impl<T> MlsDecode for Vec<T>
48 where
49     T: MlsDecode,
50 {
mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error>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)]
65 mod 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]
serialization_works()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]
data_round_trips()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]
empty_vec_can_be_deserialized()89     fn empty_vec_can_be_deserialized() {
90         assert_eq!(Vec::<u8>::new(), Vec::mls_decode(&mut &[0u8][..]).unwrap());
91     }
92 
93     #[test]
too_few_items_to_deserialize_gives_an_error()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 }
101