use std::path::PathBuf;
use thiserror::Error;
use crate::types::SettingsLevel;
#[derive(Error, Debug)]
pub enum SettingsError {
#[error("failed to read settings from {path}: {source}")]
ReadError {
path: PathBuf,
#[source]
source: std::io::Error,
},
#[error("failed to write settings to {path}: {source}")]
WriteError {
path: PathBuf,
#[source]
source: std::io::Error,
},
#[error("failed to parse settings from {path}: {source}")]
ParseError {
path: PathBuf,
#[source]
source: serde_json::Error,
},
#[error("failed to serialize settings: {0}")]
SerializeError(#[from] serde_json::Error),
#[error("could not determine home directory")]
NoHomeDirectory,
#[error("could not determine project directory: {0}")]
NoProjectDirectory(String),
#[error("settings file not found at {0}")]
NotFound(PathBuf),
#[error("permission denied accessing settings at {path}: {source}")]
PermissionDenied {
path: PathBuf,
#[source]
source: std::io::Error,
},
#[error("cannot write to system-level managed settings (read-only)")]
SystemSettingsReadOnly,
#[error("invalid settings level '{0:?}' for this operation")]
InvalidLevel(SettingsLevel),
#[error("failed to create directory {path}: {source}")]
CreateDirError {
path: PathBuf,
#[source]
source: std::io::Error,
},
#[error("invalid permission pattern: {0}")]
InvalidPermission(String),
#[error("configuration error: {0}")]
FigmentError(#[source] Box<figment::Error>),
}
pub type Result<T> = std::result::Result<T, SettingsError>;
impl From<figment::Error> for SettingsError {
fn from(err: figment::Error) -> Self {
SettingsError::FigmentError(Box::new(err))
}
}