use std::fmt::Debug;
use std::marker::PhantomData;
use derive_more::From;
use orion_error::reason::ConfErrReason;
use orion_error::{OrionError, StructError, UvsFrom, UvsReason};
use serde::Serialize;
#[derive(Debug, Clone, PartialEq)]
pub struct ConfCore {}
#[derive(Debug, Clone, PartialEq)]
pub struct ConfFeature {}
#[derive(Debug, Clone, PartialEq)]
pub struct ConfDynamic {}
#[derive(Debug, Clone)]
pub enum ConfType {
Core,
Feature,
Dynamic,
}
#[derive(Debug, Clone, PartialEq, Serialize, From, OrionError)]
pub enum ConfReason<T: Clone + PartialEq + Debug + Send + Sync + 'static> {
#[orion_error(identity = "conf.syntax")]
Syntax(String),
#[orion_error(identity = "conf.not_found")]
#[from(skip)]
NotFound(String),
#[orion_error(transparent)]
Uvs(UvsReason),
#[orion_error(identity = "conf.take")]
_Take(PhantomData<T>),
}
pub type ConfError = StructError<ConfReason<ConfCore>>;
pub type FeatureConfError = StructError<ConfReason<ConfFeature>>;
pub type DynamicConfError = StructError<ConfReason<ConfDynamic>>;
pub type DynamicConfReason = ConfReason<ConfDynamic>;
pub type CoreConfReason = ConfReason<ConfCore>;
pub type ConfResult<T> = Result<T, ConfError>;
pub type DynConfResult<T> = Result<T, DynamicConfError>;
pub type FeatureConfResult<T> = Result<T, FeatureConfError>;
impl From<ConfReason<ConfCore>> for UvsReason {
fn from(_: ConfReason<ConfCore>) -> Self {
UvsReason::from_conf_reason(ConfErrReason::Core)
}
}
impl From<ConfReason<ConfFeature>> for UvsReason {
fn from(_: ConfReason<ConfFeature>) -> Self {
UvsReason::feature_conf()
}
}
impl From<ConfReason<ConfDynamic>> for UvsReason {
fn from(_: ConfReason<ConfDynamic>) -> Self {
UvsReason::dynamic_conf()
}
}
impl From<ConfReason<ConfCore>> for ConfReason<ConfFeature> {
fn from(value: ConfReason<ConfCore>) -> Self {
match value {
ConfReason::Syntax(v) => ConfReason::<ConfFeature>::Syntax(v),
ConfReason::NotFound(v) => ConfReason::<ConfFeature>::NotFound(v),
ConfReason::Uvs(uvs) => ConfReason::Uvs(uvs),
ConfReason::_Take(_) => ConfReason::<ConfFeature>::_Take(PhantomData),
}
}
}
impl From<ConfReason<ConfCore>> for ConfReason<ConfDynamic> {
fn from(value: ConfReason<ConfCore>) -> Self {
match value {
ConfReason::Syntax(v) => ConfReason::<ConfDynamic>::Syntax(v),
ConfReason::NotFound(v) => ConfReason::<ConfDynamic>::NotFound(v),
ConfReason::_Take(_) => ConfReason::<ConfDynamic>::_Take(PhantomData),
ConfReason::Uvs(uvs) => ConfReason::Uvs(uvs),
}
}
}