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 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}