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#[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
30pub fn serialize<T>(ty: &T) -> Result<Vec<u8>, SerializeError>
34where
35 T: Serialize,
36{
37 canic_serialize(ty).map_err(SerializeError::from)
38}
39
40pub fn deserialize<T>(bytes: &[u8]) -> Result<T, SerializeError>
42where
43 T: DeserializeOwned,
44{
45 canic_deserialize(bytes).map_err(SerializeError::from)
46}