// 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 alloc::vec::Vec; use crate::{MlsDecode, MlsEncode, MlsSize}; impl<T> MlsSize for [T] where T: MlsSize, { fn mls_encoded_len(&self) -> usize { crate::iter::mls_encoded_len(self.iter()) } } impl<T> MlsSize for Vec<T> where T: MlsSize, { #[inline] fn mls_encoded_len(&self) -> usize { self.as_slice().mls_encoded_len() } } impl<T> MlsEncode for [T] where T: MlsEncode, { fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> { crate::iter::mls_encode(self.iter(), writer) } } impl<T> MlsEncode for Vec<T> where T: MlsEncode, { #[inline] fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> { self.as_slice().mls_encode(writer) } } impl<T> MlsDecode for Vec<T> where T: MlsDecode, { fn mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error> { crate::iter::mls_decode_collection(reader, |data| { let mut items = Vec::new(); while !data.is_empty() { items.push(T::mls_decode(data)?); } Ok(items) }) } } #[cfg(test)] mod tests { use crate::{Error, MlsDecode, MlsEncode}; use alloc::{vec, vec::Vec}; use assert_matches::assert_matches; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test as test; #[test] fn serialization_works() { assert_eq!( vec![3, 1, 2, 3], vec![1u8, 2, 3].mls_encode_to_vec().unwrap() ); } #[test] fn data_round_trips() { let val = vec![1u8, 2, 3]; let x = val.mls_encode_to_vec().unwrap(); assert_eq!(val, Vec::mls_decode(&mut &*x).unwrap()); } #[test] fn empty_vec_can_be_deserialized() { assert_eq!(Vec::<u8>::new(), Vec::mls_decode(&mut &[0u8][..]).unwrap()); } #[test] fn too_few_items_to_deserialize_gives_an_error() { assert_matches!( Vec::<u8>::mls_decode(&mut &[2, 3][..]), Err(Error::UnexpectedEOF) ); } }