wp_err/
config_error.rs

1use std::marker::PhantomData;
2
3use derive_more::From;
4use orion_error::{ConfErrReason, ErrorCode, StructError, UvsConfFrom, UvsReason};
5use serde::Serialize;
6use thiserror::Error;
7
8#[derive(Debug, Clone, PartialEq)]
9pub struct ConfCore {}
10#[derive(Debug, Clone, PartialEq)]
11pub struct ConfFeature {}
12#[derive(Debug, Clone, PartialEq)]
13pub struct ConfDynamic {}
14
15#[derive(Debug, Clone)]
16pub enum ConfType {
17    Core,
18    Feature,
19    Dynamic,
20}
21
22#[derive(Error, Debug, Clone, PartialEq, Serialize, From)]
23pub enum ConfReason<T>
24where
25    T: Clone + PartialEq,
26{
27    #[error("syntax err:{0}")]
28    Syntax(String),
29    #[from(skip)]
30    #[error("not found: {0}")]
31    NotFound(String),
32    #[error("{0}")]
33    Uvs(UvsReason),
34    #[error("_")]
35    _Take(PhantomData<T>),
36}
37impl ErrorCode for ConfReason<ConfCore> {
38    fn error_code(&self) -> i32 {
39        crate::codes::SysErrorCode::sys_code(self) as i32
40    }
41}
42
43impl ErrorCode for ConfReason<ConfFeature> {
44    fn error_code(&self) -> i32 {
45        crate::codes::SysErrorCode::sys_code(self) as i32
46    }
47}
48
49impl ErrorCode for ConfReason<ConfDynamic> {
50    fn error_code(&self) -> i32 {
51        crate::codes::SysErrorCode::sys_code(self) as i32
52    }
53}
54
55pub type ConfError = StructError<ConfReason<ConfCore>>;
56
57pub type FeatureConfError = StructError<ConfReason<ConfFeature>>;
58
59pub type DynamicConfError = StructError<ConfReason<ConfDynamic>>;
60pub type DynamicConfReason = ConfReason<ConfDynamic>;
61pub type CoreConfReason = ConfReason<ConfCore>;
62
63pub type ConfResult<T> = Result<T, ConfError>;
64pub type DynConfResult<T> = Result<T, DynamicConfError>;
65pub type FeatureConfResult<T> = Result<T, FeatureConfError>;
66
67impl From<ConfReason<ConfCore>> for UvsReason {
68    fn from(e: ConfReason<ConfCore>) -> Self {
69        let error = format!("{}", e);
70        UvsReason::from_conf(ConfErrReason::Core(error))
71    }
72}
73impl From<ConfReason<ConfFeature>> for UvsReason {
74    fn from(e: ConfReason<ConfFeature>) -> Self {
75        let error = format!("{}", e);
76        UvsReason::feature_conf(error)
77    }
78}
79impl From<ConfReason<ConfDynamic>> for UvsReason {
80    fn from(e: ConfReason<ConfDynamic>) -> Self {
81        let error = format!("{}", e);
82        UvsReason::dynamic_conf(error)
83    }
84}
85
86impl From<ConfReason<ConfCore>> for ConfReason<ConfFeature> {
87    fn from(value: ConfReason<ConfCore>) -> Self {
88        match value {
89            ConfReason::Syntax(v) => ConfReason::<ConfFeature>::Syntax(v),
90            ConfReason::NotFound(v) => ConfReason::<ConfFeature>::NotFound(v),
91            ConfReason::Uvs(uvs) => ConfReason::Uvs(uvs),
92            // propagate phantom to keep type-level marker consistent
93            ConfReason::_Take(_) => ConfReason::<ConfFeature>::_Take(PhantomData),
94        }
95    }
96}
97
98impl From<ConfReason<ConfCore>> for ConfReason<ConfDynamic> {
99    fn from(value: ConfReason<ConfCore>) -> Self {
100        match value {
101            ConfReason::Syntax(v) => ConfReason::<ConfDynamic>::Syntax(v),
102            ConfReason::NotFound(v) => ConfReason::<ConfDynamic>::NotFound(v),
103            ConfReason::_Take(_) => ConfReason::<ConfDynamic>::_Take(PhantomData),
104            ConfReason::Uvs(uvs) => ConfReason::Uvs(uvs),
105        }
106    }
107}