icydb_core/
serialize.rs

1use crate::error::{ErrorClass, ErrorOrigin, InternalError};
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 InternalError {
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>, SerializeError>
34where
35    T: Serialize,
36{
37    canic_serialize(ty).map_err(SerializeError::from)
38}
39
40/// Deserialize a value produced by [`serialize`].
41pub fn deserialize<T>(bytes: &[u8]) -> Result<T, SerializeError>
42where
43    T: DeserializeOwned,
44{
45    canic_deserialize(bytes).map_err(SerializeError::from)
46}