Skip to main content

chryso_core/
error.rs

1use std::fmt;
2
3#[derive(Debug, Clone, Copy)]
4pub struct Span {
5    pub start: usize,
6    pub end: usize,
7}
8
9#[derive(Debug)]
10pub struct ChrysoError {
11    message: String,
12    span: Option<Span>,
13    code: Option<ErrorCode>,
14}
15
16impl ChrysoError {
17    pub fn new(message: impl Into<String>) -> Self {
18        Self {
19            message: message.into(),
20            span: None,
21            code: None,
22        }
23    }
24
25    pub fn with_span(message: impl Into<String>, span: Span) -> Self {
26        Self {
27            message: message.into(),
28            span: Some(span),
29            code: None,
30        }
31    }
32
33    pub fn with_code(mut self, code: ErrorCode) -> Self {
34        self.code = Some(code);
35        self
36    }
37}
38
39impl fmt::Display for ChrysoError {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        if let Some(code) = self.code {
42            write!(f, "[{:?}] ", code)?;
43        }
44        if let Some(span) = self.span {
45            write!(f, "{} at {}..{}", self.message, span.start, span.end)
46        } else {
47            write!(f, "{}", self.message)
48        }
49    }
50}
51
52#[cfg(test)]
53mod tests {
54    use super::{ChrysoError, ErrorCode};
55
56    #[test]
57    fn error_code_in_display() {
58        let err = ChrysoError::new("boom").with_code(ErrorCode::OptimizerError);
59        let message = err.to_string();
60        assert!(message.contains("OptimizerError"));
61    }
62}
63
64impl std::error::Error for ChrysoError {}
65
66pub type ChrysoResult<T> = Result<T, ChrysoError>;
67#[derive(Debug, Clone, Copy)]
68pub enum ErrorCode {
69    ParserError,
70    PlannerError,
71    OptimizerError,
72    AdapterError,
73    MetadataError,
74}