chryso-core 0.0.2

Chryso core crate.
Documentation
use std::fmt;

#[derive(Debug, Clone, Copy)]
pub struct Span {
    pub start: usize,
    pub end: usize,
}

#[derive(Debug)]
pub struct ChrysoError {
    message: String,
    span: Option<Span>,
    code: Option<ErrorCode>,
}

impl ChrysoError {
    pub fn new(message: impl Into<String>) -> Self {
        Self {
            message: message.into(),
            span: None,
            code: None,
        }
    }

    pub fn with_span(message: impl Into<String>, span: Span) -> Self {
        Self {
            message: message.into(),
            span: Some(span),
            code: None,
        }
    }

    pub fn with_code(mut self, code: ErrorCode) -> Self {
        self.code = Some(code);
        self
    }
}

impl fmt::Display for ChrysoError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        if let Some(code) = self.code {
            write!(f, "[{:?}] ", code)?;
        }
        if let Some(span) = self.span {
            write!(f, "{} at {}..{}", self.message, span.start, span.end)
        } else {
            write!(f, "{}", self.message)
        }
    }
}

#[cfg(test)]
mod tests {
    use super::{ChrysoError, ErrorCode};

    #[test]
    fn error_code_in_display() {
        let err = ChrysoError::new("boom").with_code(ErrorCode::OptimizerError);
        let message = err.to_string();
        assert!(message.contains("OptimizerError"));
    }
}

impl std::error::Error for ChrysoError {}

pub type ChrysoResult<T> = Result<T, ChrysoError>;
#[derive(Debug, Clone, Copy)]
pub enum ErrorCode {
    ParserError,
    PlannerError,
    OptimizerError,
    AdapterError,
    MetadataError,
}