polysite 0.0.2

Highly customizable, polymorphic static site generator library
Documentation
use std::{error, fmt, io};
use tracing_error::SpanTrace;

#[derive(Debug)]
pub enum Error {
    InvalidMetadata {
        trace: SpanTrace,
    },
    InvalidRule {
        trace: SpanTrace,
    },
    SerdeJson {
        trace: SpanTrace,
        serde_error: serde_json::Error,
    },
    FileIo {
        trace: SpanTrace,
        io_error: io::Error,
    },
    User {
        trace: SpanTrace,
        user_error: Box<dyn std::error::Error + Send + Sync>,
    },
}

impl Error {
    pub fn user_error(error: impl std::error::Error + Send + Sync + 'static) -> Self {
        Self::User {
            trace: SpanTrace::capture(),
            user_error: Box::new(error),
        }
    }
}

impl fmt::Display for Error {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Error::InvalidMetadata { trace } => {
                writeln!(f, "invalid metadata:")?;
                trace.fmt(f)?;
                Ok(())
            }
            Error::InvalidRule { trace } => {
                writeln!(f, "invalid rule:")?;
                trace.fmt(f)?;
                Ok(())
            }
            Error::SerdeJson { trace, serde_error } => {
                writeln!(f, "serde JSON failed:")?;
                trace.fmt(f)?;
                writeln!(f, "error cause:")?;
                writeln!(f, "{:?}", serde_error)?;
                Ok(())
            }
            Error::FileIo { trace, io_error } => {
                writeln!(f, "file IO failed:")?;
                trace.fmt(f)?;
                writeln!(f, "error cause:")?;
                writeln!(f, "{:?}", io_error)?;
                Ok(())
            }
            Error::User { trace, user_error } => {
                writeln!(f, "user error:")?;
                trace.fmt(f)?;
                writeln!(f, "error cause:")?;
                writeln!(f, "{:?}", user_error)?;
                Ok(())
            }
        }
    }
}

impl error::Error for Error {}