1use core::range::Range;
2use oak_core::source::{SourceBuffer, ToSource};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct LuaRoot {
8 pub statements: Vec<LuaStatement>,
9 #[serde(with = "oak_core::serde_range")]
10 pub span: Range<usize>,
11}
12
13impl ToSource for LuaRoot {
14 fn to_source(&self, buffer: &mut SourceBuffer) {
15 for stmt in &self.statements {
16 stmt.to_source(buffer);
17 buffer.push("\n");
18 }
19 }
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
24pub enum LuaStatement {
25 Local(LuaLocalStatement),
26 Assignment(LuaAssignmentStatement),
27 Expression(LuaExpression),
28 Return(LuaReturnStatement),
29 }
31
32impl ToSource for LuaStatement {
33 fn to_source(&self, buffer: &mut SourceBuffer) {
34 match self {
35 LuaStatement::Local(s) => s.to_source(buffer),
36 LuaStatement::Assignment(s) => s.to_source(buffer),
37 LuaStatement::Expression(e) => e.to_source(buffer),
38 LuaStatement::Return(s) => s.to_source(buffer),
39 }
40 }
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct LuaLocalStatement {
46 pub names: Vec<String>,
47 pub values: Vec<LuaExpression>,
48}
49
50impl ToSource for LuaLocalStatement {
51 fn to_source(&self, buffer: &mut SourceBuffer) {
52 buffer.push("local ");
53 for (i, name) in self.names.iter().enumerate() {
54 if i > 0 {
55 buffer.push(", ");
56 }
57 buffer.push(name);
58 }
59 if !self.values.is_empty() {
60 buffer.push(" = ");
61 for (i, val) in self.values.iter().enumerate() {
62 if i > 0 {
63 buffer.push(", ");
64 }
65 val.to_source(buffer);
66 }
67 }
68 }
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct LuaAssignmentStatement {
74 pub targets: Vec<LuaExpression>,
75 pub values: Vec<LuaExpression>,
76}
77
78impl ToSource for LuaAssignmentStatement {
79 fn to_source(&self, buffer: &mut SourceBuffer) {
80 for (i, target) in self.targets.iter().enumerate() {
81 if i > 0 {
82 buffer.push(", ");
83 }
84 target.to_source(buffer);
85 }
86 buffer.push(" = ");
87 for (i, val) in self.values.iter().enumerate() {
88 if i > 0 {
89 buffer.push(", ");
90 }
91 val.to_source(buffer);
92 }
93 }
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct LuaReturnStatement {
99 pub values: Vec<LuaExpression>,
100}
101
102impl ToSource for LuaReturnStatement {
103 fn to_source(&self, buffer: &mut SourceBuffer) {
104 buffer.push("return ");
105 for (i, val) in self.values.iter().enumerate() {
106 if i > 0 {
107 buffer.push(", ");
108 }
109 val.to_source(buffer);
110 }
111 }
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
116pub enum LuaExpression {
117 Identifier(String),
118 Number(f64),
119 String(String),
120 Boolean(bool),
121 Nil,
122 Binary(Box<LuaBinaryExpression>),
123 }
125
126impl ToSource for LuaExpression {
127 fn to_source(&self, buffer: &mut SourceBuffer) {
128 match self {
129 LuaExpression::Identifier(id) => buffer.push(id),
130 LuaExpression::Number(n) => buffer.push(&n.to_string()),
131 LuaExpression::String(s) => {
132 buffer.push("\"");
133 buffer.push(s);
134 buffer.push("\"");
135 }
136 LuaExpression::Boolean(b) => buffer.push(if *b { "true" } else { "false" }),
137 LuaExpression::Nil => buffer.push("nil"),
138 LuaExpression::Binary(bin) => bin.to_source(buffer),
139 }
140 }
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct LuaBinaryExpression {
146 pub left: LuaExpression,
147 pub op: String,
148 pub right: LuaExpression,
149}
150
151impl ToSource for LuaBinaryExpression {
152 fn to_source(&self, buffer: &mut SourceBuffer) {
153 self.left.to_source(buffer);
154 buffer.push(" ");
155 buffer.push(&self.op);
156 buffer.push(" ");
157 self.right.to_source(buffer);
158 }
159}