1use std::fmt::Debug;
2use std::marker::PhantomData;
3
4use derive_more::From;
5
6use orion_error::{OrionError, StructError, UnifiedReason};
7use serde::Serialize;
8
9#[derive(Debug, Clone, PartialEq)]
10pub struct ConfCore {}
11#[derive(Debug, Clone, PartialEq)]
12pub struct ConfFeature {}
13#[derive(Debug, Clone, PartialEq)]
14pub struct ConfDynamic {}
15
16#[derive(Debug, Clone)]
17pub enum ConfType {
18 Core,
19 Feature,
20 Dynamic,
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, From, OrionError)]
24pub enum ConfReason<T: Clone + PartialEq + Debug + Send + Sync + 'static> {
25 #[orion_error(identity = "conf.syntax")]
26 Syntax(String),
27 #[orion_error(identity = "conf.not_found")]
28 #[from(skip)]
29 NotFound(String),
30 #[orion_error(transparent)]
31 Uvs(UnifiedReason),
32 #[orion_error(identity = "conf.take")]
33 _Take(PhantomData<T>),
34}
35
36pub type ConfError = StructError<ConfReason<ConfCore>>;
37
38pub type FeatureConfError = StructError<ConfReason<ConfFeature>>;
39
40pub type DynamicConfError = StructError<ConfReason<ConfDynamic>>;
41pub type DynamicConfReason = ConfReason<ConfDynamic>;
42pub type CoreConfReason = ConfReason<ConfCore>;
43
44pub type ConfResult<T> = Result<T, ConfError>;
45pub type DynConfResult<T> = Result<T, DynamicConfError>;
46pub type FeatureConfResult<T> = Result<T, FeatureConfError>;
47
48impl From<ConfReason<ConfCore>> for UnifiedReason {
49 fn from(_: ConfReason<ConfCore>) -> Self {
50 UnifiedReason::core_conf()
51 }
52}
53impl From<ConfReason<ConfFeature>> for UnifiedReason {
54 fn from(_: ConfReason<ConfFeature>) -> Self {
55 UnifiedReason::feature_conf()
56 }
57}
58impl From<ConfReason<ConfDynamic>> for UnifiedReason {
59 fn from(_: ConfReason<ConfDynamic>) -> Self {
60 UnifiedReason::dynamic_conf()
61 }
62}
63
64impl From<ConfReason<ConfCore>> for ConfReason<ConfFeature> {
65 fn from(value: ConfReason<ConfCore>) -> Self {
66 match value {
67 ConfReason::Syntax(v) => ConfReason::<ConfFeature>::Syntax(v),
68 ConfReason::NotFound(v) => ConfReason::<ConfFeature>::NotFound(v),
69 ConfReason::Uvs(uvs) => ConfReason::Uvs(uvs),
70 ConfReason::_Take(_) => ConfReason::<ConfFeature>::_Take(PhantomData),
72 }
73 }
74}
75
76impl From<ConfReason<ConfCore>> for ConfReason<ConfDynamic> {
77 fn from(value: ConfReason<ConfCore>) -> Self {
78 match value {
79 ConfReason::Syntax(v) => ConfReason::<ConfDynamic>::Syntax(v),
80 ConfReason::NotFound(v) => ConfReason::<ConfDynamic>::NotFound(v),
81 ConfReason::_Take(_) => ConfReason::<ConfDynamic>::_Take(PhantomData),
82 ConfReason::Uvs(uvs) => ConfReason::Uvs(uvs),
83 }
84 }
85}