orion_error/core/
universal.rs

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