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}