1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4use std::{boxed::Box, string::String, vec::Vec};
5
6#[derive(Debug, PartialEq, Clone)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub struct GoRoot {
10 pub package: Option<String>,
12 pub imports: Vec<Import>,
14 pub declarations: Vec<Declaration>,
16}
17
18#[derive(Debug, PartialEq, Clone)]
20#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21pub struct Import {
22 pub path: String,
24 pub alias: Option<String>,
26 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
28 pub span: Range<usize>,
29}
30
31#[derive(Debug, PartialEq, Clone)]
33#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
34pub enum Declaration {
35 Function(Function),
37 Variable(Variable),
39 Type(TypeDecl),
41 Const(Const),
43}
44
45#[derive(Debug, PartialEq, Clone)]
47#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
48pub struct Function {
49 pub name: String,
51 pub receiver: Option<Parameter>,
53 pub params: Vec<Parameter>,
55 pub return_types: Vec<String>,
57 pub body: Block,
59 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
61 pub span: Range<usize>,
62}
63
64#[derive(Debug, PartialEq, Clone)]
66#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
67pub struct Parameter {
68 pub name: String,
70 pub param_type: String,
72 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
74 pub span: Range<usize>,
75}
76
77#[derive(Debug, PartialEq, Clone)]
79#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
80pub struct Block {
81 pub statements: Vec<Statement>,
83 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
85 pub span: Range<usize>,
86}
87
88#[derive(Debug, PartialEq, Clone)]
90#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
91pub enum Statement {
92 Expression(Expression),
94 Assignment {
96 targets: Vec<String>,
98 values: Vec<Expression>,
100 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
102 span: Range<usize>,
103 },
104 Return {
106 values: Vec<Expression>,
108 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
110 span: Range<usize>,
111 },
112 If {
114 condition: Expression,
116 then_block: Block,
118 else_block: Option<Block>,
120 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
122 span: Range<usize>,
123 },
124 For {
126 init: Option<Box<Statement>>,
128 condition: Option<Expression>,
130 post: Option<Box<Statement>>,
132 body: Block,
134 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
136 span: Range<usize>,
137 },
138}
139
140#[derive(Debug, PartialEq, Clone)]
142#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
143pub enum Expression {
144 Identifier {
146 name: String,
148 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
150 span: Range<usize>,
151 },
152 Literal {
154 value: String,
156 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
158 span: Range<usize>,
159 },
160 Binary {
162 left: Box<Expression>,
164 op: String,
166 right: Box<Expression>,
168 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
170 span: Range<usize>,
171 },
172 Call {
174 func: Box<Expression>,
176 args: Vec<Expression>,
178 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
180 span: Range<usize>,
181 },
182}
183
184#[derive(Debug, PartialEq, Clone)]
186#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
187pub struct Variable {
188 pub name: String,
190 pub var_type: Option<String>,
192 pub value: Option<Expression>,
194 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
196 pub span: Range<usize>,
197}
198
199#[derive(Debug, PartialEq, Clone)]
201#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
202pub struct TypeDecl {
203 pub name: String,
205 pub definition: String,
207 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
209 pub span: Range<usize>,
210}
211
212#[derive(Debug, PartialEq, Clone)]
214#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
215pub struct Const {
216 pub name: String,
218 pub const_type: Option<String>,
220 pub value: Expression,
222 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
224 pub span: Range<usize>,
225}