use serde::{de::Error, Deserialize, Deserializer, Serializer};
pub trait ErrorCode
where
Self: Sized,
{
fn to_code(&self) -> u16;
fn from_code(code: u16) -> Option<Self>;
fn message(&self) -> &'static str;
}
pub fn serialize_error<S, E>(error: &E, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
E: ErrorCode,
{
serializer.serialize_u16(error.to_code())
}
pub fn deserialize_error<'de, D, E>(deserializer: D) -> Result<E, D::Error>
where
D: Deserializer<'de>,
E: ErrorCode,
{
let code = u16::deserialize(deserializer)?;
E::from_code(code).ok_or_else(|| D::Error::custom("Invalid error code"))
}