Skip to main content

canic_memory/
serialize.rs

1//!
2//! serde_cbor-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 serde::{Serialize, de::DeserializeOwned};
8use serde_cbor::{from_slice, to_vec};
9use std::fmt::Debug;
10use thiserror::Error as ThisError;
11
12///
13/// SerializeError
14///
15/// Error variants wrapping CBOR serialization or deserialization failures
16/// so callers can bubble them up uniformly.
17///
18
19#[derive(Debug, ThisError)]
20pub enum SerializeError {
21    /// CBOR serialization failed.
22    #[error("serialize error: {0}")]
23    Serialize(String),
24
25    /// CBOR deserialization failed.
26    #[error("deserialize error: {0}")]
27    Deserialize(String),
28}
29
30///
31/// Serialize a value into CBOR bytes using serde_cbor.
32///
33pub fn serialize<T>(t: &T) -> Result<Vec<u8>, SerializeError>
34where
35    T: Serialize,
36{
37    let bytes = to_vec(t).map_err(|e| SerializeError::Serialize(e.to_string()))?;
38
39    Ok(bytes)
40}
41
42///
43/// Deserialize CBOR bytes into a value using serde_cbor.
44///
45pub fn deserialize<T>(bytes: &[u8]) -> Result<T, SerializeError>
46where
47    T: DeserializeOwned,
48{
49    let t: T = from_slice(bytes).map_err(|e| SerializeError::Deserialize(e.to_string()))?;
50
51    Ok(t)
52}