use std::fmt;
use std::io;
#[derive(Debug)]
pub enum ConfigError {
FileReadError { path: String, source: io::Error },
ParseError { source: toml::de::Error },
ValidationError { reason: String },
}
impl fmt::Display for ConfigError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ConfigError::FileReadError { path, source } => {
write!(f, "Failed to read config file '{}': {}", path, source)
}
ConfigError::ParseError { source } => {
write!(f, "Failed to parse config: {}", source)
}
ConfigError::ValidationError { reason } => {
write!(f, "Config validation failed: {}", reason)
}
}
}
}
impl std::error::Error for ConfigError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
ConfigError::FileReadError { source, .. } => Some(source),
ConfigError::ParseError { source } => Some(source),
ConfigError::ValidationError { .. } => None,
}
}
}
pub type ConfigResult<T> = Result<T, ConfigError>;