1use std::error::Error;
2use std::fmt::{
3 Debug, Display,
4};
5use std::sync::mpsc::RecvTimeoutError;
6use std::time::Duration;
7
8pub type ZbusResult<T> = Result<T, ZbusErr>;
9pub type OkResult = ZbusResult<()>;
10
11pub struct ZbusErr {
12 inner: ErrKind,
13}
14
15impl ZbusErr {
22 pub fn new(inner: ErrKind) -> Self {
23 ZbusErr {
24 inner
25 }
26 }
27 pub fn err<E: Into<String>>(err: E) -> Self {
28 ZbusErr {
29 inner: ErrKind::Err(From::from(err.into()))
30 }
31 }
32 pub fn validate<E: Into<String>>(err: E) -> Self {
33 ZbusErr {
34 inner: ErrKind::Validate(From::from(err.into()))
35 }
36 }
37 pub fn time_out<E: Into<String>>(err: E, out_ms: i32) -> Self {
38 ZbusErr {
39 inner: ErrKind::TimeOut(From::from(err.into()), out_ms)
40 }
41 }
42 pub fn closed() -> Self {
43 ZbusErr {
44 inner: ErrKind::Closed
45 }
46 }
47}
48
49pub enum ErrKind {
50 TimeOut(String, i32),
51 Closed,
52 Validate(String),
53 Err(Box<dyn Error + Send + Sync>),
54}
55
56impl Debug for ZbusErr {
57 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
58 match &self.inner {
59 ErrKind::TimeOut(ref msg, ms) => write!(f, "timeout{}={}ms", msg, ms),
60 ErrKind::Closed => write!(f, "rpc client closed {}", ""),
61 ErrKind::Validate(ref msg) => write!(f, "validate fail {}", msg),
62 ErrKind::Err(err) => write!(f, "{}", err.to_string()),
63 }
64 }
65}
66
67impl Display for ZbusErr {
68 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
69 match &self.inner {
70 ErrKind::TimeOut(ref msg, ms) => write!(f, "timeout{} {}ms", msg, ms),
71 ErrKind::Closed => Display::fmt("rpc client closed {}", f),
72 ErrKind::Validate(ref msg) => write!(f, "validate fail {}", msg),
73 ErrKind::Err(err) => write!(f, "{}", err.to_string()),
74 }
75 }
76}
77
78
79impl From<RecvTimeoutError> for ZbusErr {
80 fn from(err: RecvTimeoutError) -> Self {
81 ZbusErr::new(ErrKind::TimeOut(err.to_string(), -1))
82 }
83}
84
85
86impl<B> From<Box<B>> for ZbusErr
87 where
88 B: Error + Send + Sync + 'static,
89{
90 fn from(err: Box<B>) -> ZbusErr {
91 ZbusErr::new(ErrKind::Err(err))
92 }
93}
94
95impl From<serde_json::error::Error> for ZbusErr
96{
97 fn from(err: serde_json::error::Error) -> Self {
98 Self::new(ErrKind::Err(Box::new(err)))
99 }
100}