use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub enum ConfigEasyError {
Database(rusqlite::Error),
Io(std::io::Error),
InvalidIdentifier(String),
InvalidSelection,
ValidationFailed { key: String, message: String },
InvalidActionKey(String),
ReservedActionKey(String),
DuplicateActionKey(String),
ActionFailed { key: String, message: String },
}
impl fmt::Display for ConfigEasyError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Database(error) => write!(f, "database error: {error}"),
Self::Io(error) => write!(f, "I/O error: {error}"),
Self::InvalidIdentifier(identifier) => {
write!(f, "invalid SQL identifier: {identifier}")
}
Self::InvalidSelection => f.write_str("invalid menu selection"),
Self::ValidationFailed { key, message } => {
write!(f, "validation failed for '{key}': {message}")
}
Self::InvalidActionKey(key) => write!(f, "invalid action key: {key}"),
Self::ReservedActionKey(key) => write!(f, "reserved action key: {key}"),
Self::DuplicateActionKey(key) => write!(f, "duplicate action key: {key}"),
Self::ActionFailed { key, message } => {
write!(f, "action '{key}' failed: {message}")
}
}
}
}
impl Error for ConfigEasyError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
Self::Database(error) => Some(error),
Self::Io(error) => Some(error),
Self::InvalidIdentifier(_)
| Self::InvalidSelection
| Self::ValidationFailed { .. }
| Self::InvalidActionKey(_)
| Self::ReservedActionKey(_)
| Self::DuplicateActionKey(_)
| Self::ActionFailed { .. } => None,
}
}
}
impl From<rusqlite::Error> for ConfigEasyError {
fn from(error: rusqlite::Error) -> Self {
Self::Database(error)
}
}
impl From<std::io::Error> for ConfigEasyError {
fn from(error: std::io::Error) -> Self {
Self::Io(error)
}
}