use std::path::{Path, PathBuf};
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
pub enum ConfigError {
#[error(
"could not read {}: {message}\n\
next: make that file readable, or remove it so the layer beneath it is used.",
path.display()
)]
Read {
path: PathBuf,
message: String,
},
#[error(
"{}: not valid YAML: {message}\n\
next: correct the syntax at the position named above, then re-run.",
path.display()
)]
Syntax {
path: PathBuf,
message: String,
},
#[error("{key}: {message}\nnext: {next}")]
Setting {
key: String,
message: String,
next: String,
},
}
impl ConfigError {
pub(crate) fn setting(
key: impl Into<String>,
message: impl Into<String>,
next: impl Into<String>,
) -> Self {
Self::Setting {
key: key.into(),
message: message.into(),
next: next.into(),
}
}
pub(crate) fn read(path: &Path, error: &std::io::Error) -> Self {
Self::Read {
path: path.to_path_buf(),
message: error.to_string(),
}
}
#[must_use]
pub fn key(&self) -> Option<&str> {
match self {
Self::Setting { key, .. } => Some(key),
Self::Read { .. } | Self::Syntax { .. } => None,
}
}
}