use std::fmt;
#[derive(Debug)]
#[non_exhaustive]
pub enum DocError {
Frontmatter(String),
Markdown(String),
Template(tera::Error),
Io(std::io::Error),
Escape(String),
Extension(String),
}
impl fmt::Display for DocError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DocError::Frontmatter(msg) => write!(f, "invalid frontmatter: {msg}"),
DocError::Markdown(msg) => write!(f, "markdown render error: {msg}"),
DocError::Template(e) => write!(f, "template error: {e}"),
DocError::Io(e) => write!(f, "io error: {e}"),
DocError::Escape(path) => write!(f, "output path escaped root: {path}"),
DocError::Extension(msg) => write!(f, "extension error: {msg}"),
}
}
}
impl std::error::Error for DocError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
DocError::Template(e) => Some(e),
DocError::Io(e) => Some(e),
_ => None,
}
}
}
impl DocError {
pub fn user_message(&self) -> String {
match self {
DocError::Frontmatter(_) => "invalid frontmatter".to_string(),
DocError::Markdown(_) => "could not render markdown".to_string(),
DocError::Template(_) => "template error".to_string(),
DocError::Io(_) => "io error".to_string(),
DocError::Escape(_) => "output path escaped root".to_string(),
DocError::Extension(_) => "extension error".to_string(),
}
}
}
impl From<std::io::Error> for DocError {
fn from(e: std::io::Error) -> Self {
DocError::Io(e)
}
}