use crate::catalog::Locale;
use crate::source::Span;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum WorkshopError {
Catalog(CatalogError),
Unknown {
kind: &'static str,
spelling: String,
locale: Locale,
span: Option<Span>,
},
MissingMapping {
kind: &'static str,
id: String,
locale: Locale,
},
Malformed { message: String, span: Option<Span> },
Unsupported { message: String, span: Option<Span> },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CatalogError {
pub code: &'static str,
pub message: String,
}
impl CatalogError {
pub(crate) fn malformed(message: String) -> WorkshopError {
WorkshopError::Catalog(CatalogError {
code: "malformed-catalog",
message,
})
}
pub(crate) fn validation(message: String) -> WorkshopError {
WorkshopError::Catalog(CatalogError {
code: "invalid-catalog",
message,
})
}
}
pub(crate) type Result<T> = std::result::Result<T, WorkshopError>;
impl std::fmt::Display for WorkshopError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
WorkshopError::Catalog(error) => write!(f, "{}: {}", error.code, error.message),
WorkshopError::Unknown {
kind,
spelling,
locale,
..
} => {
write!(
f,
"unknown {kind} spelling '{spelling}' for locale '{locale}'"
)
}
WorkshopError::MissingMapping { kind, id, locale } => {
write!(f, "missing {kind} mapping for locale '{locale}': '{id}'")
}
WorkshopError::Malformed { message, .. } => write!(f, "malformed: {message}"),
WorkshopError::Unsupported { message, .. } => write!(f, "unsupported: {message}"),
}
}
}