Skip to main content

orion_error/traits/
owenance.rs

1use crate::{core::DomainReason, StructError, UvsFrom};
2
3/// 非结构错误(StructError) 转化为结构错误。
4///
5use 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}