jetcrab\ast/
error.rs

1use crate::ast::Position;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub enum AstError {
6    SerializationError {
7        message: String,
8        position: Option<Position>,
9    },
10
11    DeserializationError {
12        message: String,
13        position: Option<Position>,
14    },
15
16    InvalidNode {
17        node_type: String,
18        message: String,
19        position: Option<Position>,
20    },
21
22    VisitorError {
23        message: String,
24        position: Option<Position>,
25    },
26}
27
28impl std::fmt::Display for AstError {
29    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30        match self {
31            AstError::SerializationError { message, position } => {
32                write!(f, "AST serialization error: {message}")?;
33                if let Some(pos) = position {
34                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
35                }
36                Ok(())
37            }
38            AstError::DeserializationError { message, position } => {
39                write!(f, "AST deserialization error: {message}")?;
40                if let Some(pos) = position {
41                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
42                }
43                Ok(())
44            }
45            AstError::InvalidNode {
46                node_type,
47                message,
48                position,
49            } => {
50                write!(f, "Invalid AST node '{node_type}': {message}")?;
51                if let Some(pos) = position {
52                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
53                }
54                Ok(())
55            }
56            AstError::VisitorError { message, position } => {
57                write!(f, "AST visitor error: {message}")?;
58                if let Some(pos) = position {
59                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
60                }
61                Ok(())
62            }
63        }
64    }
65}
66
67impl std::error::Error for AstError {}