mls_rs_codec/
byte_vec.rs

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
5use crate::{iter::mls_decode_split_on_collection, Error, MlsEncode, MlsSize, VarInt};
6
7use alloc::vec::Vec;
8
9/// Optimized length calculation for types that can be represented as u8 slices.
10pub fn mls_encoded_len<T>(data: &T) -> usize
11where
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.
25pub fn mls_encode<T>(data: &T, writer: &mut Vec<u8>) -> Result<(), Error>
26where
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>`
42pub fn mls_decode<T>(reader: &mut &[u8]) -> Result<T, crate::Error>
43where
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}