1#![doc = include_str!("readme.md")]
2
3use core::range::Range;
4
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7#[derive(Debug, PartialEq, Eq, Clone)]
8pub struct Identifier {
9 pub name: String,
11 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
13 pub span: Range<usize>,
14}
15
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18#[derive(Debug, PartialEq, Clone)]
19pub struct CrystalRoot {
20 pub items: Vec<Item>,
22}
23
24#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26#[derive(Debug, PartialEq, Clone)]
27pub enum Item {
28 Class(ClassDeclaration),
30 Module(ModuleDeclaration),
32 Def(MethodDeclaration),
34 Expression(Expression),
36}
37
38#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
40#[derive(Debug, PartialEq, Clone)]
41pub struct ClassDeclaration {
42 pub name: Identifier,
44 pub body: Vec<Item>,
46 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
48 pub span: Range<usize>,
49}
50
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
53#[derive(Debug, PartialEq, Clone)]
54pub struct ModuleDeclaration {
55 pub name: Identifier,
57 pub body: Vec<Item>,
59 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
61 pub span: Range<usize>,
62}
63
64#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
66#[derive(Debug, PartialEq, Clone)]
67pub struct MethodDeclaration {
68 pub name: Identifier,
70 pub params: Vec<Parameter>,
72 pub body: Vec<Item>,
74 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
76 pub span: Range<usize>,
77}
78
79#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
81#[derive(Debug, PartialEq, Clone)]
82pub struct Parameter {
83 pub name: Identifier,
85 pub type_name: Option<Identifier>,
87}
88
89#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
91#[derive(Debug, PartialEq, Clone)]
92pub enum Expression {
93 Literal(Literal),
95 Call(Call),
97}
98
99#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
101#[derive(Debug, PartialEq, Clone)]
102pub enum Literal {
103 Number(String),
105 String(String),
107 Boolean(bool),
109 Nil,
111}
112
113#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
115#[derive(Debug, PartialEq, Clone)]
116pub struct Call {
117 pub receiver: Option<Box<Expression>>,
119 pub name: Identifier,
121 pub args: Vec<Expression>,
123}