1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5use std::{boxed::Box, string::String, vec::Vec};
6
7#[derive(Debug, PartialEq, Clone)]
9#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10pub struct GoRoot {
11 pub package: Option<String>,
12 pub imports: Vec<Import>,
13 pub declarations: Vec<Declaration>,
14}
15
16#[derive(Debug, PartialEq, Clone)]
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18pub struct Import {
19 pub path: String,
20 pub alias: Option<String>,
21 #[serde(with = "oak_core::serde_range")]
22 pub span: Range<usize>,
23}
24
25#[derive(Debug, PartialEq, Clone)]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27pub enum Declaration {
28 Function(Function),
29 Variable(Variable),
30 Type(TypeDecl),
31 Const(Const),
32}
33
34#[derive(Debug, PartialEq, Clone)]
35#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
36pub struct Function {
37 pub name: String,
38 pub receiver: Option<Parameter>,
39 pub params: Vec<Parameter>,
40 pub return_types: Vec<String>,
41 pub body: Block,
42 #[serde(with = "oak_core::serde_range")]
43 pub span: Range<usize>,
44}
45
46#[derive(Debug, PartialEq, Clone)]
47#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
48pub struct Parameter {
49 pub name: String,
50 pub param_type: String,
51 #[serde(with = "oak_core::serde_range")]
52 pub span: Range<usize>,
53}
54
55#[derive(Debug, PartialEq, Clone)]
56#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
57pub struct Block {
58 pub statements: Vec<Statement>,
59 #[serde(with = "oak_core::serde_range")]
60 pub span: Range<usize>,
61}
62
63#[derive(Debug, PartialEq, Clone)]
64#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
65pub enum Statement {
66 Expression(Expression),
67 Assignment {
68 targets: Vec<String>,
69 values: Vec<Expression>,
70 #[serde(with = "oak_core::serde_range")]
71 span: Range<usize>,
72 },
73 Return {
74 values: Vec<Expression>,
75 #[serde(with = "oak_core::serde_range")]
76 span: Range<usize>,
77 },
78 If {
79 condition: Expression,
80 then_block: Block,
81 else_block: Option<Block>,
82 #[serde(with = "oak_core::serde_range")]
83 span: Range<usize>,
84 },
85 For {
86 init: Option<Box<Statement>>,
87 condition: Option<Expression>,
88 post: Option<Box<Statement>>,
89 body: Block,
90 #[serde(with = "oak_core::serde_range")]
91 span: Range<usize>,
92 },
93}
94
95#[derive(Debug, PartialEq, Clone)]
96#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
97pub enum Expression {
98 Identifier {
99 name: String,
100 #[serde(with = "oak_core::serde_range")]
101 span: Range<usize>,
102 },
103 Literal {
104 value: String,
105 #[serde(with = "oak_core::serde_range")]
106 span: Range<usize>,
107 },
108 Binary {
109 left: Box<Expression>,
110 op: String,
111 right: Box<Expression>,
112 #[serde(with = "oak_core::serde_range")]
113 span: Range<usize>,
114 },
115 Call {
116 func: Box<Expression>,
117 args: Vec<Expression>,
118 #[serde(with = "oak_core::serde_range")]
119 span: Range<usize>,
120 },
121}
122
123#[derive(Debug, PartialEq, Clone)]
124#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
125pub struct Variable {
126 pub name: String,
127 pub var_type: Option<String>,
128 pub value: Option<Expression>,
129 #[serde(with = "oak_core::serde_range")]
130 pub span: Range<usize>,
131}
132
133#[derive(Debug, PartialEq, Clone)]
134#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
135pub struct TypeDecl {
136 pub name: String,
137 pub definition: String,
138 #[serde(with = "oak_core::serde_range")]
139 pub span: Range<usize>,
140}
141
142#[derive(Debug, PartialEq, Clone)]
143#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
144pub struct Const {
145 pub name: String,
146 pub const_type: Option<String>,
147 pub value: Expression,
148 #[serde(with = "oak_core::serde_range")]
149 pub span: Range<usize>,
150}