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}