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 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}