orion_error/traits/
owenance.rs1use crate::{core::DomainReason, StructError, UvsFrom};
2
3use std::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 ErrorOwe<T, R>: ErrorOweBase<T, R>
14where
15 R: DomainReason + UvsFrom,
16{
17 fn owe_logic(self) -> Result<T, StructError<R>>;
18 fn owe_biz(self) -> Result<T, StructError<R>>;
19 fn owe_rule(self) -> Result<T, StructError<R>>;
20 fn owe_validation(self) -> Result<T, StructError<R>>;
21 fn owe_data(self) -> Result<T, StructError<R>>;
22 fn owe_conf(self) -> Result<T, StructError<R>>;
23 fn owe_res(self) -> Result<T, StructError<R>>;
24 fn owe_net(self) -> Result<T, StructError<R>>;
25 fn owe_timeout(self) -> Result<T, StructError<R>>;
26 fn owe_sys(self) -> Result<T, StructError<R>>;
27}
28
29impl<T, E, R> ErrorOweBase<T, R> for Result<T, E>
30where
31 E: Display,
32 R: DomainReason,
33{
34 fn owe(self, reason: R) -> Result<T, StructError<R>> {
35 match self {
36 Ok(v) => Ok(v),
37 Err(e) => {
38 let msg = e.to_string();
39 Err(StructError::from(reason).with_detail(msg))
40 }
41 }
42 }
43}
44
45impl<T, E, R> ErrorOwe<T, R> for Result<T, E>
46where
47 E: Display,
48 R: DomainReason + UvsFrom,
49{
50 fn owe_logic(self) -> Result<T, StructError<R>> {
51 map_err_with(self, <R as UvsFrom>::from_logic)
52 }
53 fn owe_biz(self) -> Result<T, StructError<R>> {
54 map_err_with(self, <R as UvsFrom>::from_biz)
55 }
56 fn owe_rule(self) -> Result<T, StructError<R>> {
57 map_err_with(self, <R as UvsFrom>::from_rule)
58 }
59 fn owe_validation(self) -> Result<T, StructError<R>> {
60 map_err_with(self, <R as UvsFrom>::from_validation)
61 }
62 fn owe_data(self) -> Result<T, StructError<R>> {
63 map_err_with(self, <R as UvsFrom>::from_data)
64 }
65 fn owe_conf(self) -> Result<T, StructError<R>> {
66 map_err_with(self, <R as UvsFrom>::from_conf)
67 }
68 fn owe_res(self) -> Result<T, StructError<R>> {
69 map_err_with(self, <R as UvsFrom>::from_res)
70 }
71 fn owe_net(self) -> Result<T, StructError<R>> {
72 map_err_with(self, <R as UvsFrom>::from_net)
73 }
74 fn owe_timeout(self) -> Result<T, StructError<R>> {
75 map_err_with(self, <R as UvsFrom>::from_timeout)
76 }
77 fn owe_sys(self) -> Result<T, StructError<R>> {
78 map_err_with(self, <R as UvsFrom>::from_sys)
79 }
80}
81
82fn map_err_with<T, E, R, F>(result: Result<T, E>, f: F) -> Result<T, StructError<R>>
83where
84 E: Display,
85 R: DomainReason,
86 F: FnOnce() -> R,
87{
88 result.map_err(|e| {
89 let detail = e.to_string();
90 let reason = f();
91 StructError::from(reason).with_detail(detail)
92 })
93}