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