1#![allow(deprecated)]
2
3use crate::{core::DomainReason, StructError, UvsFrom};
4
5use 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}