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}