canic_memory/
serialize.rs

1//!
2//! MiniCBOR-powered serialization helpers ensuring deterministic codecs across
3//! canisters. Provides a thin wrapper with shared error handling for CBOR
4//! round-trips in stable structures.
5//!
6
7use minicbor_serde::{from_slice, to_vec};
8use serde::{Serialize, de::DeserializeOwned};
9use std::fmt::Debug;
10use thiserror::Error as ThisError;
11
12///
13/// SerializeError
14///
15/// Error variants wrapping MiniCBOR serialization or deserialization failures
16/// so callers can bubble them up uniformly.
17///
18
19#[derive(Debug, ThisError)]
20pub enum SerializeError {
21    #[error("serialize error: {0}")]
22    Serialize(String),
23
24    #[error("deserialize error: {0}")]
25    Deserialize(String),
26}
27
28///
29/// Serialize a value into CBOR bytes using MiniCBOR.
30///
31pub fn serialize<T>(t: &T) -> Result<Vec<u8>, SerializeError>
32where
33    T: Serialize,
34{
35    let bytes = to_vec(t).map_err(|e| SerializeError::Serialize(e.to_string()))?;
36
37    Ok(bytes)
38}
39
40///
41/// Deserialize CBOR bytes into a value using MiniCBOR.
42///
43pub fn deserialize<T>(bytes: &[u8]) -> Result<T, SerializeError>
44where
45    T: DeserializeOwned,
46{
47    let t: T = from_slice(bytes).map_err(|e| SerializeError::Deserialize(e.to_string()))?;
48
49    Ok(t)
50}