orion_error/core/
universal.rs

1use std::fmt::Display;
2use thiserror::Error;
3
4use super::ErrorCode;
5
6#[derive(Debug, Error, PartialEq, Clone)]
7pub enum ConfRSEnum {
8    #[error("core config > {0}")]
9    Core(String),
10    #[error("feature config error > {0}")]
11    Feature(String),
12    #[error("dynamic config error > {0}")]
13    Dynamic(String),
14}
15
16/// Universal error reason classification
17/// 统一错误原因分类
18///
19/// # Variants
20/// - `LogicError`: Indicates business logic violations
21/// - `SysError`: Represents system-level failures
22#[derive(Debug, Error, PartialEq, Clone)]
23pub enum UvsReason {
24    #[error("logic error << {0}")]
25    LogicError(ErrorPayload),
26    #[error("biz error << {0}")]
27    BizError(ErrorPayload),
28    #[error("data error << {0}")]
29    DataError(ErrorPayload, Option<usize>),
30    #[error("sys error << {0}")]
31    SysError(ErrorPayload),
32    #[error("res error << {0}")]
33    ResError(ErrorPayload),
34    #[error("conf error << {0}")]
35    ConfError(ConfRSEnum),
36    #[error("rule error << {0}")]
37    RuleError(ErrorPayload),
38    #[error("privacy error << {0}")]
39    PrivacyError(ErrorPayload),
40}
41
42impl UvsReason {
43    pub fn core_conf<S: Into<String>>(msg: S) -> Self {
44        Self::ConfError(ConfRSEnum::Core(msg.into()))
45    }
46    pub fn feature_conf<S: Into<String>>(msg: S) -> Self {
47        Self::ConfError(ConfRSEnum::Feature(msg.into()))
48    }
49    pub fn dynamic_conf<S: Into<String>>(msg: S) -> Self {
50        Self::ConfError(ConfRSEnum::Dynamic(msg.into()))
51    }
52}
53
54pub trait UvsReasonFrom<T, S> {
55    fn from_sys(info: S) -> T;
56    fn from_rule(info: S) -> T;
57    fn from_logic(info: S) -> T;
58    fn from_biz(info: S) -> T;
59    //fn from_conf_err_msg<E: Display>(e: E, msg: String) -> T;
60    fn from_conf(info: S) -> T;
61    fn from_res(info: S) -> T;
62    fn from_data(info: S, pos: Option<usize>) -> T;
63}
64
65/// 强类型错误负载包装
66#[derive(Debug, PartialEq, Clone)]
67pub struct ErrorPayload(String);
68
69impl ErrorPayload {
70    pub fn new<S: Into<String>>(s: S) -> Self {
71        Self(s.into())
72    }
73}
74
75impl Display for ErrorPayload {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        write!(f, "{}", self.0)
78    }
79}
80impl From<String> for ErrorPayload {
81    fn from(value: String) -> Self {
82        Self::new(value)
83    }
84}
85
86impl UvsReasonFrom<UvsReason, String> for UvsReason {
87    fn from_sys(info: String) -> Self {
88        UvsReason::SysError(ErrorPayload::new(info))
89    }
90
91    fn from_rule(info: String) -> Self {
92        UvsReason::RuleError(ErrorPayload::new(info))
93    }
94    fn from_logic(info: String) -> Self {
95        UvsReason::LogicError(ErrorPayload::new(info))
96    }
97    fn from_biz(info: String) -> Self {
98        UvsReason::BizError(ErrorPayload::new(info))
99    }
100
101    fn from_conf(info: String) -> Self {
102        UvsReason::ConfError(ConfRSEnum::Core(info))
103    }
104
105    fn from_res(info: String) -> Self {
106        UvsReason::ResError(ErrorPayload::new(info))
107    }
108    fn from_data(info: String, pos: Option<usize>) -> Self {
109        UvsReason::DataError(ErrorPayload::new(info), pos)
110    }
111}
112
113impl ErrorCode for UvsReason {
114    fn error_code(&self) -> i32 {
115        match self {
116            UvsReason::LogicError(_) => 100,
117            UvsReason::BizError(_) => 101,
118            UvsReason::DataError(_, _) => 102,
119            UvsReason::SysError(_) => 103,
120            UvsReason::ResError(_) => 104,
121            UvsReason::ConfError(_) => 105,
122            UvsReason::RuleError(_) => 106,
123            UvsReason::PrivacyError(_) => 107,
124        }
125    }
126}