aeon/
error.rs

1use std::fmt::{Display, Formatter};
2
3macro_rules! str_variants(
4    (pub enum $name:ident {
5        $($variant:ident),*
6        $(,)?
7    }) => {
8        #[derive(Debug)]
9        pub enum $name {
10            $($variant,)*
11        }
12
13        impl $name {
14            pub fn variant_name(&self) -> &'static str {
15                match self {
16                    $($name::$variant => stringify!($variant),)*
17                }
18            }
19        }
20    }
21);
22
23str_variants! {
24    pub enum AeonSerializeErrorCode {
25        ConversionFailed,
26        SerializationFailed,
27    }
28}
29
30str_variants! {
31    pub enum AeonDeserializeErrorCode {
32        ConversionFailed,
33        DeserializationFailed,
34        LexingFailed,
35    }
36}
37
38#[derive(Debug)]
39pub struct AeonSerializeError {
40    pub code: AeonSerializeErrorCode,
41    pub message: String,
42}
43
44#[derive(Debug)]
45pub struct AeonDeserializeError {
46    pub code: AeonDeserializeErrorCode,
47    pub message: String,
48}
49
50impl Display for AeonSerializeError {
51    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
52        write!(f, "{}: {}", self.code.variant_name(), self.message)
53    }
54}
55
56impl Display for AeonDeserializeError {
57    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
58        write!(f, "{}: {}", self.code.variant_name(), self.message)
59    }
60}
61
62impl AeonDeserializeError {
63    pub fn lexing(message: String) -> Self {
64        Self {
65            code: AeonDeserializeErrorCode::LexingFailed,
66            message,
67        }
68    }
69
70    pub fn deserialization(message: String) -> Self {
71        Self {
72            code: AeonDeserializeErrorCode::DeserializationFailed,
73            message,
74        }
75    }
76
77    pub fn conversion(message: String) -> Self {
78        Self {
79            code: AeonDeserializeErrorCode::ConversionFailed,
80            message,
81        }
82    }
83}