1use serde::{de::Error, Deserialize, Deserializer, Serializer};
3
4pub trait ErrorCode
6where
7 Self: Sized,
8{
9 fn to_code(&self) -> u16;
11 fn from_code(code: u16) -> Option<Self>;
13 fn message(&self) -> &'static str;
15}
16
17pub fn serialize_error<S, E>(error: &E, serializer: S) -> Result<S::Ok, S::Error>
19where
20 S: Serializer,
21 E: ErrorCode,
22{
23 serializer.serialize_u16(error.to_code())
24}
25
26pub fn deserialize_error<'de, D, E>(deserializer: D) -> Result<E, D::Error>
28where
29 D: Deserializer<'de>,
30 E: ErrorCode,
31{
32 let code = u16::deserialize(deserializer)?;
33 E::from_code(code).ok_or_else(|| D::Error::custom("Invalid error code"))
34}