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    #[error("Writer: {source}")]
52    Writer {
53        #[from]
54        source: ::xml::writer::Error,
55    },
56}
57
58pub type Result<T> = std::result::Result<T, Error>;
59
60#[macro_export]
61macro_rules! expect {
62    ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => {
63        match $actual {
64            $($expected)|+ => $if_ok,
65            actual => Err($crate::Error::UnexpectedToken {
66                token: stringify!($($expected)|+).to_string(),
67                found: format!("{:?}",actual)
68            }) as Result<_>
69        }
70    }
71}
72
73#[cfg(debug_assertions)]
74#[macro_export]
75macro_rules! debug_expect {
76    ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => {
77        match $actual {
78            $($expected)|+ => $if_ok,
79            actual => panic!(
80                "Internal error: Expected token {}, found {:?}",
81                stringify!($($expected)|+),
82                actual
83            )
84        }
85    }
86}
87
88#[cfg(not(debug_assertions))]
89#[macro_export]
90macro_rules! debug_expect {
91    ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => {
92        match $actual {
93            $($expected)|+ => $if_ok,
94            _ => unreachable!()
95        }
96    }
97}
98
99impl DeError for Error {
100    fn custom<T: Display>(msg: T) -> Self {
101        Error::Custom {
102            field: msg.to_string(),
103        }
104    }
105}
106
107impl SerError for Error {
108    fn custom<T: Display>(msg: T) -> Self {
109        Error::Custom {
110            field: msg.to_string(),
111        }
112    }
113}