1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub struct MatlabRoot {
10 pub items: Vec<Item>,
12}
13
14#[derive(Clone, Debug, PartialEq, Eq, Hash)]
16#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
17pub enum Item {
18 Function(Function),
20 Class(Class),
22 Statement(Statement),
24}
25
26#[derive(Clone, Debug, PartialEq, Eq, Hash)]
28#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
29pub struct Function {
30 pub name: String,
32 pub inputs: Vec<String>,
34 pub outputs: Vec<String>,
36 pub body: Vec<Statement>,
38 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
40 pub span: Range<usize>,
41}
42
43#[derive(Clone, Debug, PartialEq, Eq, Hash)]
45#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
46pub struct Class {
47 pub name: String,
49 pub superclasses: Vec<String>,
51 pub properties: Vec<Property>,
53 pub methods: Vec<Function>,
55 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
57 pub span: Range<usize>,
58}
59
60#[derive(Clone, Debug, PartialEq, Eq, Hash)]
62#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
63pub struct Property {
64 pub name: String,
66 pub default_value: Option<String>,
68 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70 pub span: Range<usize>,
71}
72
73#[derive(Clone, Debug, PartialEq, Eq, Hash)]
75#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
76pub enum Statement {
77 Assignment {
79 target: String,
80 value: String,
81 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
82 span: Range<usize>,
83 },
84 Expression {
86 value: String,
87 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
88 span: Range<usize>,
89 },
90 If {
92 condition: String,
93 body: Vec<Statement>,
94 else_ifs: Vec<(String, Vec<Statement>)>,
95 else_body: Option<Vec<Statement>>,
96 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
97 span: Range<usize>,
98 },
99 For {
101 variable: String,
102 range: String,
103 body: Vec<Statement>,
104 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
105 span: Range<usize>,
106 },
107 While {
109 condition: String,
110 body: Vec<Statement>,
111 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
112 span: Range<usize>,
113 },
114}
115
116pub struct MatlabScript {
117 pub items: Vec<Item>,
118}
119
120impl MatlabScript {
121 pub fn new(items: Vec<Item>) -> Self {
122 Self { items }
123 }
124}