fmi_schema/fmi3/variable/
model_variables.rs1use super::{
2 AbstractVariableTrait, FmiBinary, FmiBoolean, FmiClock, FmiFloat32, FmiFloat64, FmiInt8,
3 FmiInt16, FmiInt32, FmiInt64, FmiString, FmiUInt8, FmiUInt16, FmiUInt32, FmiUInt64,
4 TypedArrayableVariableTrait,
5};
6
7#[derive(hard_xml::XmlRead, hard_xml::XmlWrite, Debug, PartialEq)]
8pub enum Variable {
9 #[xml(tag = "Int8")]
10 Int8(FmiInt8),
11 #[xml(tag = "UInt8")]
12 UInt8(FmiUInt8),
13 #[xml(tag = "Int16")]
14 Int16(FmiInt16),
15 #[xml(tag = "UInt16")]
16 UInt16(FmiUInt16),
17 #[xml(tag = "Int32")]
18 Int32(FmiInt32),
19 #[xml(tag = "UInt32")]
20 UInt32(FmiUInt32),
21 #[xml(tag = "Int64")]
22 Int64(FmiInt64),
23 #[xml(tag = "UInt64")]
24 UInt64(FmiUInt64),
25 #[xml(tag = "Float32")]
26 Float32(FmiFloat32),
27 #[xml(tag = "Float64")]
28 Float64(FmiFloat64),
29 #[xml(tag = "Boolean")]
30 Boolean(FmiBoolean),
31 #[xml(tag = "String")]
32 String(FmiString),
33 #[xml(tag = "Binary")]
34 Binary(FmiBinary),
35 #[xml(tag = "Clock")]
36 Clock(FmiClock),
37}
38
39#[derive(Debug, PartialEq, Default, hard_xml::XmlRead, hard_xml::XmlWrite)]
40#[xml(tag = "ModelVariables")]
41pub struct ModelVariables {
42 #[xml(
43 child = "Int8",
44 child = "UInt8",
45 child = "Int16",
46 child = "UInt16",
47 child = "Int32",
48 child = "UInt32",
49 child = "Int64",
50 child = "UInt64",
51 child = "Float32",
52 child = "Float64",
53 child = "Boolean",
54 child = "String",
55 child = "Binary",
56 child = "Clock"
57 )]
58 pub variables: Vec<Variable>,
59}
60
61impl ModelVariables {
62 pub fn len(&self) -> usize {
64 self.iter_abstract().count()
65 }
66
67 pub fn is_empty(&self) -> bool {
68 self.len() == 0
69 }
70
71 pub fn iter_abstract(&self) -> impl Iterator<Item = &dyn AbstractVariableTrait> {
73 self.variables.iter().map(|v| match v {
74 Variable::Int8(var) => var as &dyn AbstractVariableTrait,
75 Variable::UInt8(var) => var as &dyn AbstractVariableTrait,
76 Variable::Int16(var) => var as &dyn AbstractVariableTrait,
77 Variable::UInt16(var) => var as &dyn AbstractVariableTrait,
78 Variable::Int32(var) => var as &dyn AbstractVariableTrait,
79 Variable::UInt32(var) => var as &dyn AbstractVariableTrait,
80 Variable::Int64(var) => var as &dyn AbstractVariableTrait,
81 Variable::UInt64(var) => var as &dyn AbstractVariableTrait,
82 Variable::Float32(var) => var as &dyn AbstractVariableTrait,
83 Variable::Float64(var) => var as &dyn AbstractVariableTrait,
84 Variable::Boolean(var) => var as &dyn AbstractVariableTrait,
85 Variable::String(var) => var as &dyn AbstractVariableTrait,
86 Variable::Binary(var) => var as &dyn AbstractVariableTrait,
87 Variable::Clock(var) => var as &dyn AbstractVariableTrait,
88 })
89 }
90
91 pub fn iter_floating(&self) -> impl Iterator<Item = &dyn TypedArrayableVariableTrait> {
93 self.variables.iter().filter_map(|v| match v {
94 Variable::Float32(var) => Some(var as &dyn TypedArrayableVariableTrait),
95 Variable::Float64(var) => Some(var as &dyn TypedArrayableVariableTrait),
96 _ => None,
97 })
98 }
99
100 pub fn find_by_name(&self, name: &str) -> Option<&dyn AbstractVariableTrait> {
102 self.iter_abstract().find(|v| v.name() == name)
103 }
104
105 pub fn float32(&self) -> Vec<&FmiFloat32> {
107 self.variables
108 .iter()
109 .filter_map(|v| match v {
110 Variable::Float32(var) => Some(var),
111 _ => None,
112 })
113 .collect()
114 }
115
116 pub fn float64(&self) -> Vec<&FmiFloat64> {
118 self.variables
119 .iter()
120 .filter_map(|v| match v {
121 Variable::Float64(var) => Some(var),
122 _ => None,
123 })
124 .collect()
125 }
126
127 pub fn int8(&self) -> Vec<&FmiInt8> {
129 self.variables
130 .iter()
131 .filter_map(|v| match v {
132 Variable::Int8(var) => Some(var),
133 _ => None,
134 })
135 .collect()
136 }
137
138 pub fn uint8(&self) -> Vec<&FmiUInt8> {
140 self.variables
141 .iter()
142 .filter_map(|v| match v {
143 Variable::UInt8(var) => Some(var),
144 _ => None,
145 })
146 .collect()
147 }
148
149 pub fn int16(&self) -> Vec<&FmiInt16> {
151 self.variables
152 .iter()
153 .filter_map(|v| match v {
154 Variable::Int16(var) => Some(var),
155 _ => None,
156 })
157 .collect()
158 }
159
160 pub fn uint16(&self) -> Vec<&FmiUInt16> {
162 self.variables
163 .iter()
164 .filter_map(|v| match v {
165 Variable::UInt16(var) => Some(var),
166 _ => None,
167 })
168 .collect()
169 }
170
171 pub fn int32(&self) -> Vec<&FmiInt32> {
173 self.variables
174 .iter()
175 .filter_map(|v| match v {
176 Variable::Int32(var) => Some(var),
177 _ => None,
178 })
179 .collect()
180 }
181
182 pub fn uint32(&self) -> Vec<&FmiUInt32> {
184 self.variables
185 .iter()
186 .filter_map(|v| match v {
187 Variable::UInt32(var) => Some(var),
188 _ => None,
189 })
190 .collect()
191 }
192
193 pub fn int64(&self) -> Vec<&FmiInt64> {
195 self.variables
196 .iter()
197 .filter_map(|v| match v {
198 Variable::Int64(var) => Some(var),
199 _ => None,
200 })
201 .collect()
202 }
203
204 pub fn uint64(&self) -> Vec<&FmiUInt64> {
206 self.variables
207 .iter()
208 .filter_map(|v| match v {
209 Variable::UInt64(var) => Some(var),
210 _ => None,
211 })
212 .collect()
213 }
214
215 pub fn boolean(&self) -> Vec<&FmiBoolean> {
217 self.variables
218 .iter()
219 .filter_map(|v| match v {
220 Variable::Boolean(var) => Some(var),
221 _ => None,
222 })
223 .collect()
224 }
225
226 pub fn string(&self) -> Vec<&FmiString> {
228 self.variables
229 .iter()
230 .filter_map(|v| match v {
231 Variable::String(var) => Some(var),
232 _ => None,
233 })
234 .collect()
235 }
236
237 pub fn binary(&self) -> Vec<&FmiBinary> {
239 self.variables
240 .iter()
241 .filter_map(|v| match v {
242 Variable::Binary(var) => Some(var),
243 _ => None,
244 })
245 .collect()
246 }
247}
248
249pub trait AppendToModelVariables {
251 fn append_to_variables(self, variables: &mut ModelVariables);
252}
253
254impl AppendToModelVariables for FmiFloat32 {
255 fn append_to_variables(self, variables: &mut ModelVariables) {
256 variables.variables.push(Variable::Float32(self));
257 }
258}
259
260impl AppendToModelVariables for FmiFloat64 {
261 fn append_to_variables(self, variables: &mut ModelVariables) {
262 variables.variables.push(Variable::Float64(self));
263 }
264}
265
266impl AppendToModelVariables for FmiInt8 {
267 fn append_to_variables(self, variables: &mut ModelVariables) {
268 variables.variables.push(Variable::Int8(self));
269 }
270}
271
272impl AppendToModelVariables for FmiInt16 {
273 fn append_to_variables(self, variables: &mut ModelVariables) {
274 variables.variables.push(Variable::Int16(self));
275 }
276}
277
278impl AppendToModelVariables for FmiInt32 {
279 fn append_to_variables(self, variables: &mut ModelVariables) {
280 variables.variables.push(Variable::Int32(self));
281 }
282}
283
284impl AppendToModelVariables for FmiInt64 {
285 fn append_to_variables(self, variables: &mut ModelVariables) {
286 variables.variables.push(Variable::Int64(self));
287 }
288}
289
290impl AppendToModelVariables for FmiUInt8 {
291 fn append_to_variables(self, variables: &mut ModelVariables) {
292 variables.variables.push(Variable::UInt8(self));
293 }
294}
295
296impl AppendToModelVariables for FmiUInt16 {
297 fn append_to_variables(self, variables: &mut ModelVariables) {
298 variables.variables.push(Variable::UInt16(self));
299 }
300}
301
302impl AppendToModelVariables for FmiUInt32 {
303 fn append_to_variables(self, variables: &mut ModelVariables) {
304 variables.variables.push(Variable::UInt32(self));
305 }
306}
307
308impl AppendToModelVariables for FmiUInt64 {
309 fn append_to_variables(self, variables: &mut ModelVariables) {
310 variables.variables.push(Variable::UInt64(self));
311 }
312}
313
314impl AppendToModelVariables for FmiBoolean {
315 fn append_to_variables(self, variables: &mut ModelVariables) {
316 variables.variables.push(Variable::Boolean(self));
317 }
318}
319
320impl AppendToModelVariables for FmiString {
321 fn append_to_variables(self, variables: &mut ModelVariables) {
322 variables.variables.push(Variable::String(self));
323 }
324}
325
326impl AppendToModelVariables for FmiBinary {
327 fn append_to_variables(self, variables: &mut ModelVariables) {
328 variables.variables.push(Variable::Binary(self));
329 }
330}
331
332impl AppendToModelVariables for FmiClock {
333 fn append_to_variables(self, variables: &mut ModelVariables) {
334 variables.variables.push(Variable::Clock(self));
335 }
336}