use std::fmt;
use serde::de;
use crate::ConfigError;
#[derive(Debug)]
pub(crate) enum ConfigDeserializeError {
Message(String),
Config(ConfigError),
}
impl ConfigDeserializeError {
pub(crate) fn from_config(error: ConfigError) -> Self {
Self::Config(error)
}
pub(crate) fn into_config_error(self, path: &str) -> ConfigError {
match self {
ConfigDeserializeError::Message(message) => ConfigError::DeserializeError {
path: path.to_string(),
message,
source: None,
},
ConfigDeserializeError::Config(error) => {
let message = error.to_string();
ConfigError::DeserializeError {
path: path.to_string(),
message,
source: Some(Box::new(error)),
}
}
}
}
}
impl de::Error for ConfigDeserializeError {
fn custom<T: fmt::Display>(msg: T) -> Self {
Self::Message(msg.to_string())
}
}
impl fmt::Display for ConfigDeserializeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ConfigDeserializeError::Message(message) => f.write_str(message),
ConfigDeserializeError::Config(error) => error.fmt(f),
}
}
}
impl std::error::Error for ConfigDeserializeError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
ConfigDeserializeError::Message(_) => None,
ConfigDeserializeError::Config(error) => Some(error),
}
}
}