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 lliteral {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("not only ff group")]
34 NotOnlyFF,
35
36 #[error(transparent)]
37 Io(#[from] std::io::Error),
38
39 #[error(transparent)]
40 ParseFloat(ParseFloatError),
41
42 #[error("parse expr rror: {0}")]
43 ParseExpr(String),
44
45 #[error("parse error: {0}")]
46 Parse(String),
47
48 #[error("value kind unmatch, expect {0} but got {1}")]
49 ValueKindUnmatch(&'static str, &'static str),
50
51 #[error("{0} >> {1}")]
52 Context(String, Box<LibError>),
53}
54
55pub type LibResult<T> = Result<T, LibError>;
56
57pub trait LibErrorContext {
58 fn context<S: Into<String>>(self, f: impl Fn() -> S) -> Self;
59}
60
61impl<T> LibErrorContext for Result<T, LibError> {
62 fn context<S: Into<String>>(self, f: impl Fn() -> S) -> Self {
63 self.map_err(|e| LibError::Context(f().into(), Box::new(e)))
64 }
65}