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 #[cfg_attr(feature = "serde", 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 params: Vec<Parameter>,
39 pub return_types: Vec<String>,
40 pub body: Block,
41 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
42 pub span: Range<usize>,
43}
44
45#[derive(Debug, PartialEq, Clone)]
46#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
47pub struct Parameter {
48 pub name: String,
49 pub param_type: String,
50 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
51 pub span: Range<usize>,
52}
53
54#[derive(Debug, PartialEq, Clone)]
55#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56pub struct Block {
57 pub statements: Vec<Statement>,
58 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
59 pub span: Range<usize>,
60}
61
62#[derive(Debug, PartialEq, Clone)]
63#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
64pub enum Statement {
65 Expression(Expression),
66 Assignment {
67 targets: Vec<String>,
68 values: Vec<Expression>,
69 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70 span: Range<usize>,
71 },
72 Return {
73 values: Vec<Expression>,
74 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
75 span: Range<usize>,
76 },
77 If {
78 condition: Expression,
79 then_block: Block,
80 else_block: Option<Block>,
81 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
82 span: Range<usize>,
83 },
84 For {
85 init: Option<Box<Statement>>,
86 condition: Option<Expression>,
87 post: Option<Box<Statement>>,
88 body: Block,
89 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
90 span: Range<usize>,
91 },
92}
93
94#[derive(Debug, PartialEq, Clone)]
95#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96pub enum Expression {
97 Identifier {
98 name: String,
99 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
100 span: Range<usize>,
101 },
102 Literal {
103 value: String,
104 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
105 span: Range<usize>,
106 },
107 Binary {
108 left: Box<Expression>,
109 op: String,
110 right: Box<Expression>,
111 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
112 span: Range<usize>,
113 },
114 Call {
115 func: Box<Expression>,
116 args: Vec<Expression>,
117 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
118 span: Range<usize>,
119 },
120}
121
122#[derive(Debug, PartialEq, Clone)]
123#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
124pub struct Variable {
125 pub name: String,
126 pub var_type: Option<String>,
127 pub value: Option<Expression>,
128 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
129 pub span: Range<usize>,
130}
131
132#[derive(Debug, PartialEq, Clone)]
133#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
134pub struct TypeDecl {
135 pub name: String,
136 pub definition: String,
137 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
138 pub span: Range<usize>,
139}
140
141#[derive(Debug, PartialEq, Clone)]
142#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
143pub struct Const {
144 pub name: String,
145 pub const_type: Option<String>,
146 pub value: Expression,
147 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
148 pub span: Range<usize>,
149}