1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
use crate::app::variations::*;
use crate::app::QualifierCode;
use crate::app::parse::range::{RangedSequence, Range};
use crate::app::parse::parser::*;
use crate::app::parse::bytes::*;
use crate::app::parse::bit::{BitSequence, DoubleBitSequence};
use crate::master::{ReadHandler, HeaderInfo};
use crate::app::ObjectParseError;
use scursor::ReadCursor;
#[derive(Debug, PartialEq)]
pub(crate) enum RangedVariation<'a> {
Group1Var0,
Group1Var1(BitSequence<'a>),
Group1Var2(RangedSequence<'a, Group1Var2>),
Group3Var0,
Group3Var1(DoubleBitSequence<'a>),
Group3Var2(RangedSequence<'a, Group3Var2>),
Group10Var0,
Group10Var1(BitSequence<'a>),
Group10Var2(RangedSequence<'a, Group10Var2>),
Group20Var0,
Group20Var1(RangedSequence<'a, Group20Var1>),
Group20Var2(RangedSequence<'a, Group20Var2>),
Group20Var5(RangedSequence<'a, Group20Var5>),
Group20Var6(RangedSequence<'a, Group20Var6>),
Group21Var0,
Group21Var1(RangedSequence<'a, Group21Var1>),
Group21Var2(RangedSequence<'a, Group21Var2>),
Group21Var5(RangedSequence<'a, Group21Var5>),
Group21Var6(RangedSequence<'a, Group21Var6>),
Group21Var9(RangedSequence<'a, Group21Var9>),
Group21Var10(RangedSequence<'a, Group21Var10>),
Group30Var0,
Group30Var1(RangedSequence<'a, Group30Var1>),
Group30Var2(RangedSequence<'a, Group30Var2>),
Group30Var3(RangedSequence<'a, Group30Var3>),
Group30Var4(RangedSequence<'a, Group30Var4>),
Group30Var5(RangedSequence<'a, Group30Var5>),
Group30Var6(RangedSequence<'a, Group30Var6>),
Group40Var0,
Group40Var1(RangedSequence<'a, Group40Var1>),
Group40Var2(RangedSequence<'a, Group40Var2>),
Group40Var3(RangedSequence<'a, Group40Var3>),
Group40Var4(RangedSequence<'a, Group40Var4>),
Group80Var1(BitSequence<'a>),
Group110Var0,
Group110VarX(u8, RangedBytesSequence<'a>),
}
impl<'a> RangedVariation<'a> {
pub(crate) fn parse_non_read(v: Variation, qualifier: QualifierCode, range: Range, cursor: &mut ReadCursor<'a>) -> Result<RangedVariation<'a>, ObjectParseError> {
match v {
Variation::Group1Var0 => Ok(RangedVariation::Group1Var0),
Variation::Group1Var1 => Ok(RangedVariation::Group1Var1(BitSequence::parse(range, cursor)?)),
Variation::Group1Var2 => Ok(RangedVariation::Group1Var2(RangedSequence::parse(range, cursor)?)),
Variation::Group3Var0 => Ok(RangedVariation::Group3Var0),
Variation::Group3Var1 => Ok(RangedVariation::Group3Var1(DoubleBitSequence::parse(range, cursor)?)),
Variation::Group3Var2 => Ok(RangedVariation::Group3Var2(RangedSequence::parse(range, cursor)?)),
Variation::Group10Var0 => Ok(RangedVariation::Group10Var0),
Variation::Group10Var1 => Ok(RangedVariation::Group10Var1(BitSequence::parse(range, cursor)?)),
Variation::Group10Var2 => Ok(RangedVariation::Group10Var2(RangedSequence::parse(range, cursor)?)),
Variation::Group20Var0 => Ok(RangedVariation::Group20Var0),
Variation::Group20Var1 => Ok(RangedVariation::Group20Var1(RangedSequence::parse(range, cursor)?)),
Variation::Group20Var2 => Ok(RangedVariation::Group20Var2(RangedSequence::parse(range, cursor)?)),
Variation::Group20Var5 => Ok(RangedVariation::Group20Var5(RangedSequence::parse(range, cursor)?)),
Variation::Group20Var6 => Ok(RangedVariation::Group20Var6(RangedSequence::parse(range, cursor)?)),
Variation::Group21Var0 => Ok(RangedVariation::Group21Var0),
Variation::Group21Var1 => Ok(RangedVariation::Group21Var1(RangedSequence::parse(range, cursor)?)),
Variation::Group21Var2 => Ok(RangedVariation::Group21Var2(RangedSequence::parse(range, cursor)?)),
Variation::Group21Var5 => Ok(RangedVariation::Group21Var5(RangedSequence::parse(range, cursor)?)),
Variation::Group21Var6 => Ok(RangedVariation::Group21Var6(RangedSequence::parse(range, cursor)?)),
Variation::Group21Var9 => Ok(RangedVariation::Group21Var9(RangedSequence::parse(range, cursor)?)),
Variation::Group21Var10 => Ok(RangedVariation::Group21Var10(RangedSequence::parse(range, cursor)?)),
Variation::Group30Var0 => Ok(RangedVariation::Group30Var0),
Variation::Group30Var1 => Ok(RangedVariation::Group30Var1(RangedSequence::parse(range, cursor)?)),
Variation::Group30Var2 => Ok(RangedVariation::Group30Var2(RangedSequence::parse(range, cursor)?)),
Variation::Group30Var3 => Ok(RangedVariation::Group30Var3(RangedSequence::parse(range, cursor)?)),
Variation::Group30Var4 => Ok(RangedVariation::Group30Var4(RangedSequence::parse(range, cursor)?)),
Variation::Group30Var5 => Ok(RangedVariation::Group30Var5(RangedSequence::parse(range, cursor)?)),
Variation::Group30Var6 => Ok(RangedVariation::Group30Var6(RangedSequence::parse(range, cursor)?)),
Variation::Group40Var0 => Ok(RangedVariation::Group40Var0),
Variation::Group40Var1 => Ok(RangedVariation::Group40Var1(RangedSequence::parse(range, cursor)?)),
Variation::Group40Var2 => Ok(RangedVariation::Group40Var2(RangedSequence::parse(range, cursor)?)),
Variation::Group40Var3 => Ok(RangedVariation::Group40Var3(RangedSequence::parse(range, cursor)?)),
Variation::Group40Var4 => Ok(RangedVariation::Group40Var4(RangedSequence::parse(range, cursor)?)),
Variation::Group80Var1 => Ok(RangedVariation::Group80Var1(BitSequence::parse(range, cursor)?)),
Variation::Group110(0) => Err(ObjectParseError::ZeroLengthOctetData),
Variation::Group110(x) => {
Ok(RangedVariation::Group110VarX(x, RangedBytesSequence::parse(x, range.get_start(), range.get_count(), cursor)?))
},
_ => Err(ObjectParseError::InvalidQualifierForVariation(v, qualifier)),
}
}
pub(crate) fn parse_read(v: Variation, qualifier: QualifierCode) -> Result<RangedVariation<'a>, ObjectParseError> {
match v {
Variation::Group1Var0 => Ok(RangedVariation::Group1Var0),
Variation::Group1Var1 => Ok(RangedVariation::Group1Var1(BitSequence::empty())),
Variation::Group1Var2 => Ok(RangedVariation::Group1Var2(RangedSequence::empty())),
Variation::Group3Var0 => Ok(RangedVariation::Group3Var0),
Variation::Group3Var1 => Ok(RangedVariation::Group3Var1(DoubleBitSequence::empty())),
Variation::Group3Var2 => Ok(RangedVariation::Group3Var2(RangedSequence::empty())),
Variation::Group10Var0 => Ok(RangedVariation::Group10Var0),
Variation::Group10Var1 => Ok(RangedVariation::Group10Var1(BitSequence::empty())),
Variation::Group10Var2 => Ok(RangedVariation::Group10Var2(RangedSequence::empty())),
Variation::Group20Var0 => Ok(RangedVariation::Group20Var0),
Variation::Group20Var1 => Ok(RangedVariation::Group20Var1(RangedSequence::empty())),
Variation::Group20Var2 => Ok(RangedVariation::Group20Var2(RangedSequence::empty())),
Variation::Group20Var5 => Ok(RangedVariation::Group20Var5(RangedSequence::empty())),
Variation::Group20Var6 => Ok(RangedVariation::Group20Var6(RangedSequence::empty())),
Variation::Group21Var0 => Ok(RangedVariation::Group21Var0),
Variation::Group21Var1 => Ok(RangedVariation::Group21Var1(RangedSequence::empty())),
Variation::Group21Var2 => Ok(RangedVariation::Group21Var2(RangedSequence::empty())),
Variation::Group21Var5 => Ok(RangedVariation::Group21Var5(RangedSequence::empty())),
Variation::Group21Var6 => Ok(RangedVariation::Group21Var6(RangedSequence::empty())),
Variation::Group21Var9 => Ok(RangedVariation::Group21Var9(RangedSequence::empty())),
Variation::Group21Var10 => Ok(RangedVariation::Group21Var10(RangedSequence::empty())),
Variation::Group30Var0 => Ok(RangedVariation::Group30Var0),
Variation::Group30Var1 => Ok(RangedVariation::Group30Var1(RangedSequence::empty())),
Variation::Group30Var2 => Ok(RangedVariation::Group30Var2(RangedSequence::empty())),
Variation::Group30Var3 => Ok(RangedVariation::Group30Var3(RangedSequence::empty())),
Variation::Group30Var4 => Ok(RangedVariation::Group30Var4(RangedSequence::empty())),
Variation::Group30Var5 => Ok(RangedVariation::Group30Var5(RangedSequence::empty())),
Variation::Group30Var6 => Ok(RangedVariation::Group30Var6(RangedSequence::empty())),
Variation::Group40Var0 => Ok(RangedVariation::Group40Var0),
Variation::Group40Var1 => Ok(RangedVariation::Group40Var1(RangedSequence::empty())),
Variation::Group40Var2 => Ok(RangedVariation::Group40Var2(RangedSequence::empty())),
Variation::Group40Var3 => Ok(RangedVariation::Group40Var3(RangedSequence::empty())),
Variation::Group40Var4 => Ok(RangedVariation::Group40Var4(RangedSequence::empty())),
Variation::Group80Var1 => Ok(RangedVariation::Group80Var1(BitSequence::empty())),
Variation::Group110(0) => Ok(RangedVariation::Group110Var0),
_ => Err(ObjectParseError::InvalidQualifierForVariation(v, qualifier)),
}
}
pub(crate) fn format_objects(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
RangedVariation::Group1Var0 => Ok(()),
RangedVariation::Group1Var1(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group1Var2(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group3Var0 => Ok(()),
RangedVariation::Group3Var1(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group3Var2(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group10Var0 => Ok(()),
RangedVariation::Group10Var1(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group10Var2(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group20Var0 => Ok(()),
RangedVariation::Group20Var1(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group20Var2(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group20Var5(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group20Var6(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group21Var0 => Ok(()),
RangedVariation::Group21Var1(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group21Var2(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group21Var5(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group21Var6(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group21Var9(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group21Var10(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group30Var0 => Ok(()),
RangedVariation::Group30Var1(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group30Var2(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group30Var3(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group30Var4(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group30Var5(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group30Var6(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group40Var0 => Ok(()),
RangedVariation::Group40Var1(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group40Var2(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group40Var3(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group40Var4(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group80Var1(seq) => format_indexed_items(f, seq.iter()),
RangedVariation::Group110Var0 => Ok(()),
RangedVariation::Group110VarX(_, seq) => format_indexed_items(f, seq.iter().map(|(x, i)| (Bytes::new(x), i))),
}
}
pub(crate) fn extract_measurements_to(&self, qualifier: QualifierCode, handler: &mut dyn ReadHandler) -> bool {
match self {
RangedVariation::Group1Var0 => {
false }
RangedVariation::Group1Var1(seq) => {
handler.handle_binary_input(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group1Var2(seq) => {
handler.handle_binary_input(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group3Var0 => {
false }
RangedVariation::Group3Var1(seq) => {
handler.handle_double_bit_binary_input(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group3Var2(seq) => {
handler.handle_double_bit_binary_input(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group10Var0 => {
false }
RangedVariation::Group10Var1(seq) => {
handler.handle_binary_output_status(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group10Var2(seq) => {
handler.handle_binary_output_status(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group20Var0 => {
false }
RangedVariation::Group20Var1(seq) => {
handler.handle_counter(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group20Var2(seq) => {
handler.handle_counter(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group20Var5(seq) => {
handler.handle_counter(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group20Var6(seq) => {
handler.handle_counter(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group21Var0 => {
false }
RangedVariation::Group21Var1(seq) => {
handler.handle_frozen_counter(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group21Var2(seq) => {
handler.handle_frozen_counter(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group21Var5(seq) => {
handler.handle_frozen_counter(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group21Var6(seq) => {
handler.handle_frozen_counter(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group21Var9(seq) => {
handler.handle_frozen_counter(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group21Var10(seq) => {
handler.handle_frozen_counter(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group30Var0 => {
false }
RangedVariation::Group30Var1(seq) => {
handler.handle_analog_input(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group30Var2(seq) => {
handler.handle_analog_input(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group30Var3(seq) => {
handler.handle_analog_input(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group30Var4(seq) => {
handler.handle_analog_input(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group30Var5(seq) => {
handler.handle_analog_input(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group30Var6(seq) => {
handler.handle_analog_input(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group40Var0 => {
false }
RangedVariation::Group40Var1(seq) => {
handler.handle_analog_output_status(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group40Var2(seq) => {
handler.handle_analog_output_status(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group40Var3(seq) => {
handler.handle_analog_output_status(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group40Var4(seq) => {
handler.handle_analog_output_status(
HeaderInfo::new(self.variation(), qualifier, false, true),
&mut seq.iter().map(|(v,i)| (v.into(), i))
);
true
}
RangedVariation::Group80Var1(_) => {
false }
RangedVariation::Group110Var0 => {
false
}
RangedVariation::Group110VarX(_,seq) => {
handler.handle_octet_string(
HeaderInfo::new(self.variation(), qualifier, false, false),
&mut seq.iter()
);
true
}
}
}
pub(crate) fn variation(&self) -> Variation {
match self {
RangedVariation::Group1Var0 => Variation::Group1Var0,
RangedVariation::Group1Var1(_) => Variation::Group1Var1,
RangedVariation::Group1Var2(_) => Variation::Group1Var2,
RangedVariation::Group3Var0 => Variation::Group3Var0,
RangedVariation::Group3Var1(_) => Variation::Group3Var1,
RangedVariation::Group3Var2(_) => Variation::Group3Var2,
RangedVariation::Group10Var0 => Variation::Group10Var0,
RangedVariation::Group10Var1(_) => Variation::Group10Var1,
RangedVariation::Group10Var2(_) => Variation::Group10Var2,
RangedVariation::Group20Var0 => Variation::Group20Var0,
RangedVariation::Group20Var1(_) => Variation::Group20Var1,
RangedVariation::Group20Var2(_) => Variation::Group20Var2,
RangedVariation::Group20Var5(_) => Variation::Group20Var5,
RangedVariation::Group20Var6(_) => Variation::Group20Var6,
RangedVariation::Group21Var0 => Variation::Group21Var0,
RangedVariation::Group21Var1(_) => Variation::Group21Var1,
RangedVariation::Group21Var2(_) => Variation::Group21Var2,
RangedVariation::Group21Var5(_) => Variation::Group21Var5,
RangedVariation::Group21Var6(_) => Variation::Group21Var6,
RangedVariation::Group21Var9(_) => Variation::Group21Var9,
RangedVariation::Group21Var10(_) => Variation::Group21Var10,
RangedVariation::Group30Var0 => Variation::Group30Var0,
RangedVariation::Group30Var1(_) => Variation::Group30Var1,
RangedVariation::Group30Var2(_) => Variation::Group30Var2,
RangedVariation::Group30Var3(_) => Variation::Group30Var3,
RangedVariation::Group30Var4(_) => Variation::Group30Var4,
RangedVariation::Group30Var5(_) => Variation::Group30Var5,
RangedVariation::Group30Var6(_) => Variation::Group30Var6,
RangedVariation::Group40Var0 => Variation::Group40Var0,
RangedVariation::Group40Var1(_) => Variation::Group40Var1,
RangedVariation::Group40Var2(_) => Variation::Group40Var2,
RangedVariation::Group40Var3(_) => Variation::Group40Var3,
RangedVariation::Group40Var4(_) => Variation::Group40Var4,
RangedVariation::Group80Var1(_) => Variation::Group80Var1,
RangedVariation::Group110Var0 => Variation::Group110(0),
RangedVariation::Group110VarX(x, _) => Variation::Group110(*x),
}
}
}