serde_xml_rs/
error.rs

1use serde::de::Error as DeError;
2use serde::ser::Error as SerError;
3use std::fmt::Display;
4use thiserror::Error;
5
6#[derive(Debug, Error)]
7pub enum Error {
8    #[error("Expected token {token}, found {found}")]
9    UnexpectedToken { token: String, found: String },
10    #[error("custom: {field}")]
11    Custom { field: String },
12    #[error("unsupported operation: '{operation}'")]
13    UnsupportedOperation { operation: String },
14
15    #[error("IO error: {source}")]
16    Io {
17        #[from]
18        source: ::std::io::Error,
19    },
20
21    #[error("FromUtf8Error: {source}")]
22    FromUtf8Error {
23        #[from]
24        source: ::std::string::FromUtf8Error,
25    },
26
27    #[error("ParseIntError: {source}")]
28    ParseIntError {
29        #[from]
30        source: ::std::num::ParseIntError,
31    },
32
33    #[error("ParseFloatError: {source}")]
34    ParseFloatError {
35        #[from]
36        source: ::std::num::ParseFloatError,
37    },
38
39    #[error("ParseBoolError: {source}")]
40    ParseBoolError {
41        #[from]
42        source: ::std::str::ParseBoolError,
43    },
44
45    #[error("Syntax: {source}")]
46    Syntax {
47        #[from]
48        source: ::xml::reader::Error,
49    },
50}
51
52pub type Result<T> = std::result::Result<T, Error>;
53
54#[macro_export]
55macro_rules! expect {
56    ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => {
57        match $actual {
58            $($expected)|+ => $if_ok,
59            actual => Err($crate::Error::UnexpectedToken {
60                token: stringify!($($expected)|+).to_string(),
61                found: format!("{:?}",actual)
62            }) as Result<_>
63        }
64    }
65}
66
67#[cfg(debug_assertions)]
68#[macro_export]
69macro_rules! debug_expect {
70    ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => {
71        match $actual {
72            $($expected)|+ => $if_ok,
73            actual => panic!(
74                "Internal error: Expected token {}, found {:?}",
75                stringify!($($expected)|+),
76                actual
77            )
78        }
79    }
80}
81
82#[cfg(not(debug_assertions))]
83#[macro_export]
84macro_rules! debug_expect {
85    ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => {
86        match $actual {
87            $($expected)|+ => $if_ok,
88            _ => unreachable!()
89        }
90    }
91}
92
93impl DeError for Error {
94    fn custom<T: Display>(msg: T) -> Self {
95        Error::Custom {
96            field: msg.to_string(),
97        }
98    }
99}
100
101impl SerError for Error {
102    fn custom<T: Display>(msg: T) -> Self {
103        Error::Custom {
104            field: msg.to_string(),
105        }
106    }
107}