Skip to main content

wp_error/
config_error.rs

1use std::marker::PhantomData;
2
3use derive_more::From;
4use orion_error::{ConfErrReason, ErrorCode, StructError, UvsFrom, 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(_: ConfReason<ConfCore>) -> Self {
69        UvsReason::from_conf_reason(ConfErrReason::Core)
70    }
71}
72impl From<ConfReason<ConfFeature>> for UvsReason {
73    fn from(_: ConfReason<ConfFeature>) -> Self {
74        UvsReason::feature_conf()
75    }
76}
77impl From<ConfReason<ConfDynamic>> for UvsReason {
78    fn from(_: ConfReason<ConfDynamic>) -> Self {
79        UvsReason::dynamic_conf()
80    }
81}
82
83impl From<ConfReason<ConfCore>> for ConfReason<ConfFeature> {
84    fn from(value: ConfReason<ConfCore>) -> Self {
85        match value {
86            ConfReason::Syntax(v) => ConfReason::<ConfFeature>::Syntax(v),
87            ConfReason::NotFound(v) => ConfReason::<ConfFeature>::NotFound(v),
88            ConfReason::Uvs(uvs) => ConfReason::Uvs(uvs),
89            // propagate phantom to keep type-level marker consistent
90            ConfReason::_Take(_) => ConfReason::<ConfFeature>::_Take(PhantomData),
91        }
92    }
93}
94
95impl From<ConfReason<ConfCore>> for ConfReason<ConfDynamic> {
96    fn from(value: ConfReason<ConfCore>) -> Self {
97        match value {
98            ConfReason::Syntax(v) => ConfReason::<ConfDynamic>::Syntax(v),
99            ConfReason::NotFound(v) => ConfReason::<ConfDynamic>::NotFound(v),
100            ConfReason::_Take(_) => ConfReason::<ConfDynamic>::_Take(PhantomData),
101            ConfReason::Uvs(uvs) => ConfReason::Uvs(uvs),
102        }
103    }
104}