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