mod cbor;
use serde::{Serialize, de::DeserializeOwned};
use std::fmt;
use thiserror::Error as ThisError;
#[derive(Debug, ThisError)]
pub enum SerializeError {
#[error("serialize error: {0}")]
Serialize(String),
#[error("deserialize error: {0}")]
Deserialize(String),
#[error("deserialize size limit exceeded: {len} bytes (limit {max_bytes})")]
DeserializeSizeLimitExceeded { len: usize, max_bytes: usize },
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SerializeErrorKind {
Serialize,
Deserialize,
DeserializeSizeLimitExceeded,
}
impl SerializeErrorKind {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Serialize => "serialize",
Self::Deserialize => "deserialize",
Self::DeserializeSizeLimitExceeded => "deserialize_size_limit_exceeded",
}
}
}
impl fmt::Display for SerializeErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl SerializeError {
#[must_use]
pub const fn kind(&self) -> SerializeErrorKind {
match self {
Self::Serialize(_) => SerializeErrorKind::Serialize,
Self::Deserialize(_) => SerializeErrorKind::Deserialize,
Self::DeserializeSizeLimitExceeded { .. } => {
SerializeErrorKind::DeserializeSizeLimitExceeded
}
}
}
}
pub fn serialize<T>(ty: &T) -> Result<Vec<u8>, SerializeError>
where
T: Serialize,
{
cbor::serialize(ty)
}
pub fn serialize_hex<T>(ty: &T) -> Result<String, SerializeError>
where
T: Serialize,
{
cbor::serialize_hex(ty)
}
pub fn serialized_len<T>(ty: &T) -> Result<usize, SerializeError>
where
T: Serialize,
{
cbor::serialize_len(ty)
}
pub fn deserialize<T>(bytes: &[u8]) -> Result<T, SerializeError>
where
T: DeserializeOwned,
{
cbor::deserialize(bytes)
}
pub fn deserialize_bounded<T>(bytes: &[u8], max_bytes: usize) -> Result<T, SerializeError>
where
T: DeserializeOwned,
{
cbor::deserialize_bounded(bytes, max_bytes)
}