easy_sockets/
error.rs

1//! Defines a trait that represents an error code and its message.
2use serde::{de::Error, Deserialize, Deserializer, Serializer};
3
4/// Trait definable on enun to define error codes and their messages.
5pub trait ErrorCode
6where
7    Self: Sized,
8{
9    /// Converts error to a code for compression
10    fn to_code(&self) -> u16;
11    /// Maps code to error type
12    fn from_code(code: u16) -> Option<Self>;
13    /// Returns error message attached to code
14    fn message(&self) -> &'static str;
15}
16
17// Helper function to serialize any ErrorCode type
18pub 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
26// Helper function to deserialize any ErrorCode type
27pub 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}