lightmotif_io/
error.rs

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}