reda_lib/
error.rs

1use std::num::ParseFloatError;
2
3
4#[derive(Debug, thiserror::Error)]
5pub enum LibError {
6    #[error("except group")]
7    ExceptLibGroup,
8
9    #[error("library param should only a name")]
10    LibraryParamLenUnmatch,
11
12    #[error("expect attr {0} but not found")]
13    MissAttr(String),
14
15    #[error("unsupport direction literal {0}")]
16    UnsupportDirection(String),
17
18    #[error("unsupport antenna diode {0}")]
19    UnsupportAntennaDiodeType(String),
20
21    #[error("unsupport driver type {0}")]
22    UnsupportDriverType(String),
23
24    #[error("unsupport dont fault {0}")]
25    UnsupportDontFault(String),
26
27    #[error("unsupport next state type {0}")]
28    UnsupportNextStateType(String),
29
30    #[error("unsupport enum {1} for {0}")]
31    UnsupportEnumValue(&'static str, String),
32
33    #[error(transparent)]
34    Io(#[from] std::io::Error),
35
36    #[error(transparent)]
37    ParseFloat(ParseFloatError),
38
39    #[error("parse expr rror: {0}")]
40    ParseExpr(String),
41
42    #[error("parse error: {0}")]
43    Parse(String),
44
45    #[error("value kind unmatch, expect {0} but got {1}")]
46    ValueKindUnmatch(&'static str, &'static str),
47
48    #[error("{0} >> {1}")]
49    Context(String, Box<LibError>),
50}
51
52pub type LibResult<T> = Result<T, LibError>;
53
54pub trait LibErrorContext {
55    fn context<S: Into<String>>(self, f: impl Fn() -> S) -> Self;
56}
57
58impl<T> LibErrorContext for Result<T, LibError> {
59    fn context<S: Into<String>>(self, f: impl Fn() -> S) -> Self {
60        self.map_err(|e| LibError::Context(f().into(), Box::new(e)))
61    }
62}