dpp/util/
cbor_serializer.rs1use integer_encoding::VarIntWriter;
2use serde::ser;
3
4use crate::errors::ProtocolError;
5
6pub 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}