1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct MatlabRoot {
8 pub items: Vec<Item>,
10}
11
12#[derive(Clone, Debug, PartialEq, Eq, Hash)]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15pub enum Item {
16 Function(Function),
18 Class(Class),
20 Statement(Statement),
22}
23
24#[derive(Clone, Debug, PartialEq, Eq, Hash)]
26#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
27pub struct Function {
28 pub name: String,
30 pub inputs: Vec<String>,
32 pub outputs: Vec<String>,
34 pub body: Vec<Statement>,
36 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
38 pub span: Range<usize>,
39}
40
41#[derive(Clone, Debug, PartialEq, Eq, Hash)]
43#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
44pub struct Class {
45 pub name: String,
47 pub superclasses: Vec<String>,
49 pub properties: Vec<Property>,
51 pub methods: Vec<Function>,
53 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
55 pub span: Range<usize>,
56}
57
58#[derive(Clone, Debug, PartialEq, Eq, Hash)]
60#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
61pub struct Property {
62 pub name: String,
64 pub default_value: Option<String>,
66 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
68 pub span: Range<usize>,
69}
70
71#[derive(Clone, Debug, PartialEq, Eq, Hash)]
73#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
74pub enum Statement {
75 Assignment {
77 target: String,
79 value: String,
81 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
83 span: Range<usize>,
84 },
85 Expression {
87 value: String,
89 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
91 span: Range<usize>,
92 },
93 If {
95 condition: String,
97 body: Vec<Statement>,
99 else_ifs: Vec<(String, Vec<Statement>)>,
101 else_body: Option<Vec<Statement>>,
103 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
105 span: Range<usize>,
106 },
107 For {
109 variable: String,
111 range: String,
113 body: Vec<Statement>,
115 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
117 span: Range<usize>,
118 },
119 While {
121 condition: String,
123 body: Vec<Statement>,
125 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
127 span: Range<usize>,
128 },
129}
130
131pub struct MatlabScript {
133 pub items: Vec<Item>,
135}
136
137impl MatlabScript {
138 pub fn new(items: Vec<Item>) -> Self {
140 Self { items }
141 }
142}