dpp/util/
cbor_serializer.rs

1use integer_encoding::VarIntWriter;
2use serde::ser;
3
4use crate::errors::ProtocolError;
5
6// ciborium::value
7
8pub const MAX_ENCODED_KBYTE_LENGTH: usize = 16;
9
10pub fn serializable_value_to_cbor<T: ?Sized + ser::Serialize>(
11    value: &T,
12    version: Option<u32>,
13) -> Result<Vec<u8>, ProtocolError> {
14    let mut buffer: Vec<u8> = Vec::new();
15    if let Some(version) = version {
16        buffer
17            .write_varint(version)
18            .map_err(|e| ProtocolError::EncodingError(e.to_string()))?;
19    }
20    let size_with_protocol = buffer.len();
21
22    ciborium::ser::into_writer(value, &mut buffer)
23        .map_err(|e| ProtocolError::EncodingError(e.to_string()))?;
24
25    if (buffer.len() - size_with_protocol) >= MAX_ENCODED_KBYTE_LENGTH * 1024 {
26        return Err(ProtocolError::MaxEncodedBytesReachedError {
27            size_hit: buffer.len(),
28            max_size_kbytes: MAX_ENCODED_KBYTE_LENGTH,
29        });
30    }
31
32    Ok(buffer)
33}