// 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::{iter::mls_decode_split_on_collection, Error, MlsEncode, MlsSize, VarInt}; use alloc::vec::Vec; /// Optimized length calculation for types that can be represented as u8 slices. pub fn mls_encoded_len(data: &T) -> usize where T: AsRef<[u8]>, { fn slice_len(data: &[u8]) -> usize { let len = data.len(); let header_length = VarInt::try_from(len).unwrap_or(VarInt(0)).mls_encoded_len(); header_length + len } slice_len(data.as_ref()) } /// Optimized encoding for types that can be represented as u8 slices. pub fn mls_encode(data: &T, writer: &mut Vec) -> Result<(), Error> where T: AsRef<[u8]>, { fn encode_slice(data: &[u8], writer: &mut Vec) -> Result<(), Error> { let len = VarInt::try_from(data.len())?; len.mls_encode(writer)?; writer.extend_from_slice(data); Ok(()) } encode_slice(data.as_ref(), writer) } /// Optimized decoding for types that can be represented as `Vec` pub fn mls_decode(reader: &mut &[u8]) -> Result where T: From>, { fn decode_vec(reader: &mut &[u8]) -> Result, crate::Error> { let (data, rest) = mls_decode_split_on_collection(reader)?; *reader = rest; Ok(data.to_vec()) } let out = decode_vec(reader)?; Ok(out.into()) }