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#[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
30pub 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
42pub 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}