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)
114                .with_detail(detail)
115                .with_std_source(e)
116        })
117    }
118}
119
120impl<T, E, R> ErrorOweSource<T, R> for Result<T, E>
121where
122    E: StdError + Send + Sync + 'static,
123    R: DomainReason + UvsFrom,
124{
125    fn owe_logic_source(self) -> Result<T, StructError<R>> {
126        map_err_with_source(self, <R as UvsFrom>::from_logic)
127    }
128    fn owe_biz_source(self) -> Result<T, StructError<R>> {
129        map_err_with_source(self, <R as UvsFrom>::from_biz)
130    }
131    fn owe_rule_source(self) -> Result<T, StructError<R>> {
132        map_err_with_source(self, <R as UvsFrom>::from_rule)
133    }
134    fn owe_validation_source(self) -> Result<T, StructError<R>> {
135        map_err_with_source(self, <R as UvsFrom>::from_validation)
136    }
137    fn owe_data_source(self) -> Result<T, StructError<R>> {
138        map_err_with_source(self, <R as UvsFrom>::from_data)
139    }
140    fn owe_conf_source(self) -> Result<T, StructError<R>> {
141        map_err_with_source(self, <R as UvsFrom>::from_conf)
142    }
143    fn owe_res_source(self) -> Result<T, StructError<R>> {
144        map_err_with_source(self, <R as UvsFrom>::from_res)
145    }
146    fn owe_net_source(self) -> Result<T, StructError<R>> {
147        map_err_with_source(self, <R as UvsFrom>::from_net)
148    }
149    fn owe_timeout_source(self) -> Result<T, StructError<R>> {
150        map_err_with_source(self, <R as UvsFrom>::from_timeout)
151    }
152    fn owe_sys_source(self) -> Result<T, StructError<R>> {
153        map_err_with_source(self, <R as UvsFrom>::from_sys)
154    }
155}
156
157fn map_err_with<T, E, R, F>(result: Result<T, E>, f: F) -> Result<T, StructError<R>>
158where
159    E: Display,
160    R: DomainReason,
161    F: FnOnce() -> R,
162{
163    result.map_err(|e| {
164        let detail = e.to_string();
165        let reason = f();
166        StructError::from(reason).with_detail(detail)
167    })
168}
169
170fn map_err_with_source<T, E, R, F>(result: Result<T, E>, f: F) -> Result<T, StructError<R>>
171where
172    E: StdError + Send + Sync + 'static,
173    R: DomainReason,
174    F: FnOnce() -> R,
175{
176    result.map_err(|e| {
177        let detail = e.to_string();
178        let reason = f();
179        StructError::from(reason)
180            .with_detail(detail)
181            .with_std_source(e)
182    })
183}