Skip to main content

orion_error/traits/
owenance.rs

1use crate::{core::DomainReason, StructError, UvsFrom};
2
3/// 非结构错误(StructError) 转化为结构错误。
4///
5use std::{error::Error as StdError, fmt::Display};
6pub trait ErrorOweBase<T, R>
7where
8    R: DomainReason,
9{
10    fn owe(self, reason: R) -> Result<T, StructError<R>>;
11}
12
13pub trait ErrorOweSourceBase<T, R>
14where
15    R: DomainReason,
16{
17    fn owe_source(self, reason: R) -> Result<T, StructError<R>>;
18}
19
20pub trait ErrorOwe<T, R>: ErrorOweBase<T, R>
21where
22    R: DomainReason + UvsFrom,
23{
24    fn owe_logic(self) -> Result<T, StructError<R>>;
25    fn owe_biz(self) -> Result<T, StructError<R>>;
26    fn owe_rule(self) -> Result<T, StructError<R>>;
27    fn owe_validation(self) -> Result<T, StructError<R>>;
28    fn owe_data(self) -> Result<T, StructError<R>>;
29    fn owe_conf(self) -> Result<T, StructError<R>>;
30    fn owe_res(self) -> Result<T, StructError<R>>;
31    fn owe_net(self) -> Result<T, StructError<R>>;
32    fn owe_timeout(self) -> Result<T, StructError<R>>;
33    fn owe_sys(self) -> Result<T, StructError<R>>;
34}
35
36pub trait ErrorOweSource<T, R>: ErrorOweSourceBase<T, R>
37where
38    R: DomainReason + UvsFrom,
39{
40    fn owe_logic_source(self) -> Result<T, StructError<R>>;
41    fn owe_biz_source(self) -> Result<T, StructError<R>>;
42    fn owe_rule_source(self) -> Result<T, StructError<R>>;
43    fn owe_validation_source(self) -> Result<T, StructError<R>>;
44    fn owe_data_source(self) -> Result<T, StructError<R>>;
45    fn owe_conf_source(self) -> Result<T, StructError<R>>;
46    fn owe_res_source(self) -> Result<T, StructError<R>>;
47    fn owe_net_source(self) -> Result<T, StructError<R>>;
48    fn owe_timeout_source(self) -> Result<T, StructError<R>>;
49    fn owe_sys_source(self) -> Result<T, StructError<R>>;
50}
51
52impl<T, E, R> ErrorOweBase<T, R> for Result<T, E>
53where
54    E: Display,
55    R: DomainReason,
56{
57    fn owe(self, reason: R) -> Result<T, StructError<R>> {
58        match self {
59            Ok(v) => Ok(v),
60            Err(e) => {
61                let msg = e.to_string();
62                Err(StructError::from(reason).with_detail(msg))
63            }
64        }
65    }
66}
67
68impl<T, E, R> ErrorOwe<T, R> for Result<T, E>
69where
70    E: Display,
71    R: DomainReason + UvsFrom,
72{
73    fn owe_logic(self) -> Result<T, StructError<R>> {
74        map_err_with(self, <R as UvsFrom>::from_logic)
75    }
76    fn owe_biz(self) -> Result<T, StructError<R>> {
77        map_err_with(self, <R as UvsFrom>::from_biz)
78    }
79    fn owe_rule(self) -> Result<T, StructError<R>> {
80        map_err_with(self, <R as UvsFrom>::from_rule)
81    }
82    fn owe_validation(self) -> Result<T, StructError<R>> {
83        map_err_with(self, <R as UvsFrom>::from_validation)
84    }
85    fn owe_data(self) -> Result<T, StructError<R>> {
86        map_err_with(self, <R as UvsFrom>::from_data)
87    }
88    fn owe_conf(self) -> Result<T, StructError<R>> {
89        map_err_with(self, <R as UvsFrom>::from_conf)
90    }
91    fn owe_res(self) -> Result<T, StructError<R>> {
92        map_err_with(self, <R as UvsFrom>::from_res)
93    }
94    fn owe_net(self) -> Result<T, StructError<R>> {
95        map_err_with(self, <R as UvsFrom>::from_net)
96    }
97    fn owe_timeout(self) -> Result<T, StructError<R>> {
98        map_err_with(self, <R as UvsFrom>::from_timeout)
99    }
100    fn owe_sys(self) -> Result<T, StructError<R>> {
101        map_err_with(self, <R as UvsFrom>::from_sys)
102    }
103}
104
105impl<T, E, R> ErrorOweSourceBase<T, R> for Result<T, E>
106where
107    E: StdError + Send + Sync + 'static,
108    R: DomainReason,
109{
110    fn owe_source(self, reason: R) -> Result<T, StructError<R>> {
111        self.map_err(|e| {
112            let detail = e.to_string();
113            StructError::from(reason).with_detail(detail).with_source(e)
114        })
115    }
116}
117
118impl<T, E, R> ErrorOweSource<T, R> for Result<T, E>
119where
120    E: StdError + Send + Sync + 'static,
121    R: DomainReason + UvsFrom,
122{
123    fn owe_logic_source(self) -> Result<T, StructError<R>> {
124        map_err_with_source(self, <R as UvsFrom>::from_logic)
125    }
126    fn owe_biz_source(self) -> Result<T, StructError<R>> {
127        map_err_with_source(self, <R as UvsFrom>::from_biz)
128    }
129    fn owe_rule_source(self) -> Result<T, StructError<R>> {
130        map_err_with_source(self, <R as UvsFrom>::from_rule)
131    }
132    fn owe_validation_source(self) -> Result<T, StructError<R>> {
133        map_err_with_source(self, <R as UvsFrom>::from_validation)
134    }
135    fn owe_data_source(self) -> Result<T, StructError<R>> {
136        map_err_with_source(self, <R as UvsFrom>::from_data)
137    }
138    fn owe_conf_source(self) -> Result<T, StructError<R>> {
139        map_err_with_source(self, <R as UvsFrom>::from_conf)
140    }
141    fn owe_res_source(self) -> Result<T, StructError<R>> {
142        map_err_with_source(self, <R as UvsFrom>::from_res)
143    }
144    fn owe_net_source(self) -> Result<T, StructError<R>> {
145        map_err_with_source(self, <R as UvsFrom>::from_net)
146    }
147    fn owe_timeout_source(self) -> Result<T, StructError<R>> {
148        map_err_with_source(self, <R as UvsFrom>::from_timeout)
149    }
150    fn owe_sys_source(self) -> Result<T, StructError<R>> {
151        map_err_with_source(self, <R as UvsFrom>::from_sys)
152    }
153}
154
155fn map_err_with<T, E, R, F>(result: Result<T, E>, f: F) -> Result<T, StructError<R>>
156where
157    E: Display,
158    R: DomainReason,
159    F: FnOnce() -> R,
160{
161    result.map_err(|e| {
162        let detail = e.to_string();
163        let reason = f();
164        StructError::from(reason).with_detail(detail)
165    })
166}
167
168fn map_err_with_source<T, E, R, F>(result: Result<T, E>, f: F) -> Result<T, StructError<R>>
169where
170    E: StdError + Send + Sync + 'static,
171    R: DomainReason,
172    F: FnOnce() -> R,
173{
174    result.map_err(|e| {
175        let detail = e.to_string();
176        let reason = f();
177        StructError::from(reason).with_detail(detail).with_source(e)
178    })
179}