1use thiserror::{Error as ThisError};
2
3#[derive(Clone, Debug, ThisError)]
4pub enum Error {
5 #[error("Incomplete: {0:?}", size)]
6 Incomplete { size: Option<usize> },
7 #[error("{0}", msg)]
8 Failure { msg: String },
9 #[error("{0}", msg)]
10 Custom { msg: String },
11}
12
13unsafe impl Sync for Error {}
14unsafe impl Send for Error {}
15
16impl<I, E> From<nom::Err<I, E>> for Error
17 where
18 I: std::fmt::Debug,
19 E: std::fmt::Debug,
20{
21 fn from(err: nom::Err<I, E>) -> Self {
22 Error::from(&err)
23 }
24}
25
26impl<I, E> From<&nom::Err<I, E>> for Error
27 where
28 I: std::fmt::Debug,
29 E: std::fmt::Debug,
30{
31 fn from(err: &nom::Err<I, E>) -> Self {
32 match err {
33 nom::Err::Incomplete(nom::Needed::Unknown) => {
34 Error::Incomplete {
35 size: None
36 }
37 }
38 nom::Err::Incomplete(nom::Needed::Size(sz)) => {
39 Error::Incomplete {
40 size: Some(*sz)
41 }
42 }
43 nom::Err::Error(c) => {
44 Error::Failure {
45 msg: format!("Error: {:?}", c)
46 }
47 }
48 nom::Err::Failure(c) => {
49 Error::Failure {
50 msg: format!("Failure: {:?}", c)
51 }
52 }
53 }
54 }
55}