1use scribe_core::Result;
7
8#[derive(Debug, Clone)]
10pub struct AstNode {
11 pub node_type: String,
12 pub value: Option<String>,
13 pub children: Vec<AstNode>,
14 pub position: Option<crate::types::Range>,
15}
16
17impl AstNode {
18 pub fn new(node_type: String) -> Self {
19 Self {
20 node_type,
21 value: None,
22 children: Vec::new(),
23 position: None,
24 }
25 }
26
27 pub fn with_value(mut self, value: String) -> Self {
28 self.value = Some(value);
29 self
30 }
31
32 pub fn add_child(mut self, child: AstNode) -> Self {
33 self.children.push(child);
34 self
35 }
36}
37
38pub struct AstWalker;
40
41impl AstWalker {
42 pub fn new() -> Self {
43 Self
44 }
45
46 pub fn walk(&self, _node: &AstNode, _callback: fn(&AstNode)) -> Result<()> {
47 Ok(())
49 }
50}
51
52impl Default for AstWalker {
53 fn default() -> Self {
54 Self::new()
55 }
56}
57
58pub mod types {
60 use serde::{Deserialize, Serialize};
61
62 #[derive(Debug, Clone, Serialize, Deserialize)]
63 pub struct Position {
64 pub line: usize,
65 pub column: usize,
66 }
67
68 impl Position {
69 pub fn new(line: usize, column: usize) -> Self {
70 Self { line, column }
71 }
72 }
73
74 #[derive(Debug, Clone, Serialize, Deserialize)]
75 pub struct Range {
76 pub start: Position,
77 pub end: Position,
78 }
79
80 impl Range {
81 pub fn new(start: Position, end: Position) -> Self {
82 Self { start, end }
83 }
84 }
85}