icydb_core/
serialize.rs

1use crate::runtime_error::{ErrorClass, ErrorOrigin, RuntimeError};
2use canic_memory::serialize::{deserialize as canic_deserialize, serialize as canic_serialize};
3use serde::{Serialize, de::DeserializeOwned};
4use thiserror::Error as ThisError;
5
6///
7/// SerializeError
8///
9
10#[derive(Debug, ThisError)]
11pub enum SerializeError {
12    #[error(transparent)]
13    SerializeError(#[from] canic_memory::serialize::SerializeError),
14}
15
16impl SerializeError {
17    pub(crate) const fn class(&self) -> ErrorClass {
18        match self {
19            Self::SerializeError(_) => ErrorClass::Internal,
20        }
21    }
22}
23
24impl From<SerializeError> for RuntimeError {
25    fn from(err: SerializeError) -> Self {
26        Self::new(err.class(), ErrorOrigin::Serialize, err.to_string())
27    }
28}
29
30/// Serialize a value using the default `canic` serializer.
31///
32/// This helper keeps the error type aligned with the rest of `icydb`.
33pub fn serialize<T>(ty: &T) -> Result<Vec<u8>, RuntimeError>
34where
35    T: Serialize,
36{
37    canic_serialize(ty)
38        .map_err(SerializeError::from)
39        .map_err(RuntimeError::from)
40}
41
42/// Deserialize a value produced by [`serialize`].
43pub fn deserialize<T>(bytes: &[u8]) -> Result<T, RuntimeError>
44where
45    T: DeserializeOwned,
46{
47    canic_deserialize(bytes)
48        .map_err(SerializeError::from)
49        .map_err(RuntimeError::from)
50}