Skip to main content

wp_error/
config_error.rs

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            // propagate phantom to keep type-level marker consistent
71            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}