Skip to main content

orion_error/traits/
owenance.rs

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