// 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; impl MlsSize for Option { #[inline] fn mls_encoded_len(&self) -> usize { 1 + match self { Some(v) => v.mls_encoded_len(), None => 0, } } } impl MlsEncode for Option { fn mls_encode(&self, writer: &mut Vec) -> Result<(), crate::Error> { if let Some(item) = self { writer.push(1); item.mls_encode(writer) } else { writer.push(0); Ok(()) } } } impl MlsDecode for Option { fn mls_decode(reader: &mut &[u8]) -> Result { match u8::mls_decode(reader)? { 0 => Ok(None), 1 => T::mls_decode(reader).map(Some), n => Err(crate::Error::OptionOutOfRange(n)), } } } #[cfg(test)] mod tests { use alloc::vec; use crate::{Error, MlsDecode, MlsEncode}; use assert_matches::assert_matches; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test as test; #[test] fn none_is_serialized_correctly() { assert_eq!(vec![0u8], None::.mls_encode_to_vec().unwrap()); } #[test] fn some_is_serialized_correctly() { assert_eq!(vec![1u8, 2], Some(2u8).mls_encode_to_vec().unwrap()); } #[test] fn none_round_trips() { let val = None::; let x = val.mls_encode_to_vec().unwrap(); assert_eq!(val, Option::mls_decode(&mut &*x).unwrap()); } #[test] fn some_round_trips() { let val = Some(32u8); let x = val.mls_encode_to_vec().unwrap(); assert_eq!(val, Option::mls_decode(&mut &*x).unwrap()); } #[test] fn deserializing_invalid_discriminant_fails() { assert_matches!( Option::::mls_decode(&mut &[2u8][..]), Err(Error::OptionOutOfRange(_)) ); } }