1use crate::{core::DomainReason, StructError, UvsFrom};
2
3use 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}