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 {}