1use std::fmt::Display;
2use std::fmt::Formatter;
3use std::sync::Arc;
4
5use nom::error::Error as NomError;
6
7#[derive(Clone, Debug)]
8pub enum Error {
9 InvalidData(Option<String>),
10 Io(Arc<std::io::Error>),
11 Nom(Arc<NomError<String>>),
12}
13
14impl From<lightmotif::err::InvalidData> for Error {
15 fn from(_error: lightmotif::err::InvalidData) -> Self {
16 Error::InvalidData(None)
17 }
18}
19
20impl From<std::io::Error> for Error {
21 fn from(error: std::io::Error) -> Self {
22 Error::Io(Arc::new(error))
23 }
24}
25
26impl From<NomError<&'_ str>> for Error {
27 fn from(error: NomError<&'_ str>) -> Self {
28 Error::Nom(Arc::new(NomError::new(error.input.to_string(), error.code)))
29 }
30}
31
32impl From<nom::Err<NomError<&'_ str>>> for Error {
33 fn from(err: nom::Err<NomError<&'_ str>>) -> Self {
34 match err {
35 nom::Err::Incomplete(_) => unreachable!(),
36 nom::Err::Error(e) => Error::from(e),
37 nom::Err::Failure(e) => Error::from(e),
38 }
39 }
40}
41
42impl Display for Error {
43 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
44 match self {
45 Error::InvalidData(None) => f.write_str("invalid data"),
46 Error::InvalidData(Some(x)) => write!(f, "invalid data: {}", x),
47 Error::Io(err) => err.fmt(f),
48 Error::Nom(err) => err.fmt(f),
49 }
50 }
51}
52
53impl std::error::Error for Error {
54 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
55 match self {
56 Error::InvalidData(_) => None,
57 Error::Io(e) => Some(e),
58 Error::Nom(e) => Some(e),
59 }
60 }
61}