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
7use crate::ElixirTokenType;
8
9#[derive(Debug, PartialEq, Eq, Clone)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct Identifier {
12 pub name: String,
13 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
14 pub span: Range<usize>,
15}
16
17#[derive(Debug, PartialEq, Clone)]
19#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
20pub struct ElixirRoot {
21 pub items: Vec<Item>,
22}
23
24#[derive(Debug, PartialEq, Clone)]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27pub enum Item {
28 Module(Module),
29 Function(Function),
30 Statement(Statement),
31}
32
33#[derive(Debug, PartialEq, Clone)]
34#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
35pub struct Module {
36 pub name: Identifier,
37 pub items: Vec<Item>,
38 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
39 pub span: Range<usize>,
40}
41
42#[derive(Debug, PartialEq, Clone)]
43#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
44pub struct Function {
45 pub name: Identifier,
46 pub params: Vec<Param>,
47 pub body: Block,
48 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
49 pub span: Range<usize>,
50}
51
52#[derive(Debug, PartialEq, Clone)]
53#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
54pub struct Param {
55 pub name: Identifier,
56 pub ty: Option<String>,
57 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
58 pub span: Range<usize>,
59}
60
61#[derive(Debug, PartialEq, Clone)]
62#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
63pub struct Block {
64 pub statements: Vec<Statement>,
65 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
66 pub span: Range<usize>,
67}
68
69#[derive(Debug, PartialEq, Clone)]
70#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
71pub enum Statement {
72 Let {
73 name: Identifier,
74 expr: Expr,
75 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
76 span: Range<usize>,
77 },
78 ExprStmt {
79 expr: Expr,
80 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
81 span: Range<usize>,
82 },
83}
84
85#[derive(Debug, PartialEq, Clone)]
86#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
87pub enum Expr {
88 Ident(Identifier),
89 Atom {
90 value: String,
91 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
92 span: Range<usize>,
93 },
94 Number {
95 value: String,
96 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
97 span: Range<usize>,
98 },
99 String {
100 value: String,
101 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
102 span: Range<usize>,
103 },
104 Bool {
105 value: bool,
106 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
107 span: Range<usize>,
108 },
109 Unary {
110 op: ElixirTokenType,
111 expr: Box<Expr>,
112 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
113 span: Range<usize>,
114 },
115 Binary {
116 left: Box<Expr>,
117 op: ElixirTokenType,
118 right: Box<Expr>,
119 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
120 span: Range<usize>,
121 },
122 Match {
123 left: Box<Expr>,
124 right: Box<Expr>,
125 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
126 span: Range<usize>,
127 },
128 Call {
129 callee: Box<Expr>,
130 args: Vec<Expr>,
131 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
132 span: Range<usize>,
133 },
134 Field {
135 receiver: Box<Expr>,
136 field: Identifier,
137 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
138 span: Range<usize>,
139 },
140 Attribute {
141 name: Identifier,
142 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
143 span: Range<usize>,
144 },
145 Index {
146 receiver: Box<Expr>,
147 index: Box<Expr>,
148 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
149 span: Range<usize>,
150 },
151 Paren {
152 expr: Box<Expr>,
153 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
154 span: Range<usize>,
155 },
156 List {
157 items: Vec<Expr>,
158 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
159 span: Range<usize>,
160 },
161 Tuple {
162 items: Vec<Expr>,
163 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
164 span: Range<usize>,
165 },
166 Map {
167 items: Vec<Expr>,
168 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
169 span: Range<usize>,
170 },
171 Block(Block),
172}