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
77    fn owe_biz(self) -> Result<T, StructError<R>> {
78        map_err_with(self, <R as UvsFrom>::from_biz)
79    }
80
81    fn owe_rule(self) -> Result<T, StructError<R>> {
82        map_err_with(self, <R as UvsFrom>::from_rule)
83    }
84
85    fn owe_validation(self) -> Result<T, StructError<R>> {
86        map_err_with(self, <R as UvsFrom>::from_validation)
87    }
88
89    fn owe_data(self) -> Result<T, StructError<R>> {
90        map_err_with(self, <R as UvsFrom>::from_data)
91    }
92
93    fn owe_conf(self) -> Result<T, StructError<R>> {
94        map_err_with(self, <R as UvsFrom>::from_conf)
95    }
96
97    fn owe_res(self) -> Result<T, StructError<R>> {
98        map_err_with(self, <R as UvsFrom>::from_res)
99    }
100
101    fn owe_net(self) -> Result<T, StructError<R>> {
102        map_err_with(self, <R as UvsFrom>::from_net)
103    }
104
105    fn owe_timeout(self) -> Result<T, StructError<R>> {
106        map_err_with(self, <R as UvsFrom>::from_timeout)
107    }
108
109    fn owe_sys(self) -> Result<T, StructError<R>> {
110        map_err_with(self, <R as UvsFrom>::from_sys)
111    }
112}
113
114impl<T, E, R> ErrorOweSourceBase<T, R> for Result<T, E>
115where
116    E: StdError + Send + Sync + 'static,
117    R: DomainReason,
118{
119    fn owe_source(self, reason: R) -> Result<T, StructError<R>> {
120        self.map_err(|e| {
121            let detail = e.to_string();
122            StructError::from(reason)
123                .with_detail(detail)
124                .with_std_source(e)
125        })
126    }
127}
128
129impl<T, E, R> ErrorOweSource<T, R> for Result<T, E>
130where
131    E: StdError + Send + Sync + 'static,
132    R: DomainReason + UvsFrom,
133{
134    fn owe_logic_source(self) -> Result<T, StructError<R>> {
135        map_err_with_source(self, <R as UvsFrom>::from_logic)
136    }
137
138    fn owe_biz_source(self) -> Result<T, StructError<R>> {
139        map_err_with_source(self, <R as UvsFrom>::from_biz)
140    }
141
142    fn owe_rule_source(self) -> Result<T, StructError<R>> {
143        map_err_with_source(self, <R as UvsFrom>::from_rule)
144    }
145
146    fn owe_validation_source(self) -> Result<T, StructError<R>> {
147        map_err_with_source(self, <R as UvsFrom>::from_validation)
148    }
149
150    fn owe_data_source(self) -> Result<T, StructError<R>> {
151        map_err_with_source(self, <R as UvsFrom>::from_data)
152    }
153
154    fn owe_conf_source(self) -> Result<T, StructError<R>> {
155        map_err_with_source(self, <R as UvsFrom>::from_conf)
156    }
157
158    fn owe_res_source(self) -> Result<T, StructError<R>> {
159        map_err_with_source(self, <R as UvsFrom>::from_res)
160    }
161
162    fn owe_net_source(self) -> Result<T, StructError<R>> {
163        map_err_with_source(self, <R as UvsFrom>::from_net)
164    }
165
166    fn owe_timeout_source(self) -> Result<T, StructError<R>> {
167        map_err_with_source(self, <R as UvsFrom>::from_timeout)
168    }
169
170    fn owe_sys_source(self) -> Result<T, StructError<R>> {
171        map_err_with_source(self, <R as UvsFrom>::from_sys)
172    }
173}
174
175fn map_err_with<T, E, R, F>(result: Result<T, E>, f: F) -> Result<T, StructError<R>>
176where
177    E: Display,
178    R: DomainReason,
179    F: FnOnce() -> R,
180{
181    result.map_err(|e| {
182        let detail = e.to_string();
183        let reason = f();
184        StructError::from(reason).with_detail(detail)
185    })
186}
187
188fn map_err_with_source<T, E, R, F>(result: Result<T, E>, f: F) -> Result<T, StructError<R>>
189where
190    E: StdError + Send + Sync + 'static,
191    R: DomainReason,
192    F: FnOnce() -> R,
193{
194    result.map_err(|e| {
195        let detail = e.to_string();
196        let reason = f();
197        StructError::from(reason)
198            .with_detail(detail)
199            .with_std_source(e)
200    })
201}