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