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 crate::{iter::mls_decode_split_on_collection, Error, MlsEncode, MlsSize, VarInt};
6
7 use alloc::vec::Vec;
8
9 /// Optimized length calculation for types that can be represented as u8 slices.
mls_encoded_len<T>(data: &T) -> usize where T: AsRef<[u8]>,10 pub fn mls_encoded_len<T>(data: &T) -> usize
11 where
12 T: AsRef<[u8]>,
13 {
14 fn slice_len(data: &[u8]) -> usize {
15 let len = data.len();
16 let header_length = VarInt::try_from(len).unwrap_or(VarInt(0)).mls_encoded_len();
17
18 header_length + len
19 }
20
21 slice_len(data.as_ref())
22 }
23
24 /// Optimized encoding for types that can be represented as u8 slices.
mls_encode<T>(data: &T, writer: &mut Vec<u8>) -> Result<(), Error> where T: AsRef<[u8]>,25 pub fn mls_encode<T>(data: &T, writer: &mut Vec<u8>) -> Result<(), Error>
26 where
27 T: AsRef<[u8]>,
28 {
29 fn encode_slice(data: &[u8], writer: &mut Vec<u8>) -> Result<(), Error> {
30 let len = VarInt::try_from(data.len())?;
31
32 len.mls_encode(writer)?;
33 writer.extend_from_slice(data);
34
35 Ok(())
36 }
37
38 encode_slice(data.as_ref(), writer)
39 }
40
41 /// Optimized decoding for types that can be represented as `Vec<u8>`
mls_decode<T>(reader: &mut &[u8]) -> Result<T, crate::Error> where T: From<Vec<u8>>,42 pub fn mls_decode<T>(reader: &mut &[u8]) -> Result<T, crate::Error>
43 where
44 T: From<Vec<u8>>,
45 {
46 fn decode_vec(reader: &mut &[u8]) -> Result<Vec<u8>, crate::Error> {
47 let (data, rest) = mls_decode_split_on_collection(reader)?;
48
49 *reader = rest;
50
51 Ok(data.to_vec())
52 }
53
54 let out = decode_vec(reader)?;
55 Ok(out.into())
56 }
57