1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct MatlabRoot {
7 pub items: Vec<Item>,
9}
10
11#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
13pub enum Item {
14 Function(Function),
16 Class(Class),
18 Statement(Statement),
20}
21
22#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
24pub struct Function {
25 pub name: String,
27 pub inputs: Vec<String>,
29 pub outputs: Vec<String>,
31 pub body: Vec<Statement>,
33 #[serde(with = "oak_core::serde_range")]
35 pub span: Range<usize>,
36}
37
38#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
40pub struct Class {
41 pub name: String,
43 pub superclasses: Vec<String>,
45 pub properties: Vec<Property>,
47 pub methods: Vec<Function>,
49 #[serde(with = "oak_core::serde_range")]
51 pub span: Range<usize>,
52}
53
54#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
56pub struct Property {
57 pub name: String,
59 pub default_value: Option<String>,
61 #[serde(with = "oak_core::serde_range")]
63 pub span: Range<usize>,
64}
65
66#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
68pub enum Statement {
69 Assignment {
71 target: String,
72 value: String,
73 #[serde(with = "oak_core::serde_range")]
74 span: Range<usize>,
75 },
76 Expression {
78 value: String,
79 #[serde(with = "oak_core::serde_range")]
80 span: Range<usize>,
81 },
82 If {
84 condition: String,
85 body: Vec<Statement>,
86 else_ifs: Vec<(String, Vec<Statement>)>,
87 else_body: Option<Vec<Statement>>,
88 #[serde(with = "oak_core::serde_range")]
89 span: Range<usize>,
90 },
91 For {
93 variable: String,
94 range: String,
95 body: Vec<Statement>,
96 #[serde(with = "oak_core::serde_range")]
97 span: Range<usize>,
98 },
99 While {
101 condition: String,
102 body: Vec<Statement>,
103 #[serde(with = "oak_core::serde_range")]
104 span: Range<usize>,
105 },
106}
107
108pub struct MatlabScript {
109 pub items: Vec<Item>,
110}
111
112impl MatlabScript {
113 pub fn new(items: Vec<Item>) -> Self {
114 Self { items }
115 }
116}