@@ -178,34 +178,78 @@ pub enum Sorting {
178
178
Name ,
179
179
}
180
180
181
- impl FromStr for Sorting {
181
+ impl Sorting {
182
+ fn from_parts ( parts : & [ & str ] ) -> Option < Self > {
183
+ if parts. contains ( & "Offset" ) {
184
+ Some ( Self :: Offset )
185
+ } else if parts. contains ( & "OffsetReserved" ) {
186
+ Some ( Self :: OffsetReversed )
187
+ } else if parts. contains ( & "Name" ) {
188
+ Some ( Self :: Name )
189
+ } else {
190
+ None
191
+ }
192
+ }
193
+ }
194
+
195
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
196
+ pub enum DerivableSorting {
197
+ Unchanged ( Option < Sorting > ) ,
198
+ DeriveLast ( Option < Sorting > ) ,
199
+ }
200
+
201
+ impl DerivableSorting {
202
+ fn from_parts ( parts : & [ & str ] ) -> Self {
203
+ let sorting = Sorting :: from_parts ( parts) ;
204
+ if parts. contains ( & "DerivedLast" ) {
205
+ Self :: DeriveLast ( sorting)
206
+ } else {
207
+ Self :: Unchanged ( sorting)
208
+ }
209
+ }
210
+ }
211
+
212
+ impl FromStr for DerivableSorting {
182
213
type Err = ( ) ;
183
214
184
215
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
185
- match s {
186
- "Offset" => Ok ( Self :: Offset ) ,
187
- "OffsetReversed" => Ok ( Self :: OffsetReversed ) ,
188
- "Name" => Ok ( Self :: OffsetReversed ) ,
189
- _ => Err ( ( ) ) ,
190
- }
216
+ let parts = s. split ( ',' ) . collect :: < Vec < _ > > ( ) ;
217
+ Ok ( DerivableSorting :: from_parts ( & parts) )
218
+ }
219
+ }
220
+
221
+ impl Default for DerivableSorting {
222
+ fn default ( ) -> Self {
223
+ Self :: Unchanged ( None )
191
224
}
192
225
}
193
226
194
227
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
195
- pub enum RegistersOrClustersFirst {
196
- Registers ,
197
- Clusters ,
228
+ pub enum RcSorting {
229
+ Unchanged ( DerivableSorting ) ,
230
+ RegistersFirst ( DerivableSorting ) ,
231
+ ClustersFirst ( DerivableSorting ) ,
198
232
}
199
233
200
- impl FromStr for RegistersOrClustersFirst {
234
+ impl Default for RcSorting {
235
+ fn default ( ) -> Self {
236
+ Self :: Unchanged ( Default :: default ( ) )
237
+ }
238
+ }
239
+
240
+ impl FromStr for RcSorting {
201
241
type Err = ( ) ;
202
242
203
243
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
204
- match s {
205
- "Registers" => Ok ( Self :: Registers ) ,
206
- "Clusters" => Ok ( Self :: Clusters ) ,
207
- _ => Err ( ( ) ) ,
208
- }
244
+ let parts = s. split ( ',' ) . collect :: < Vec < _ > > ( ) ;
245
+ let derivable_sorting = DerivableSorting :: from_parts ( & parts) ;
246
+ Ok ( if parts. contains ( & "RegistersFirst" ) {
247
+ Self :: RegistersFirst ( derivable_sorting)
248
+ } else if parts. contains ( & "ClustersFirst" ) {
249
+ Self :: ClustersFirst ( derivable_sorting)
250
+ } else {
251
+ Self :: Unchanged ( derivable_sorting)
252
+ } )
209
253
}
210
254
}
211
255
@@ -228,10 +272,7 @@ pub struct Config {
228
272
pub peripheral_base_address : NumberFormat ,
229
273
230
274
/// Sort peripherals in specified order
231
- pub peripheral_sorting : Option < Sorting > ,
232
-
233
- /// Place derived peripherals in the end
234
- pub peripheral_derived_last : bool ,
275
+ pub peripheral_sorting : DerivableSorting ,
235
276
236
277
/// Format of addressBlock's offset element
237
278
///
@@ -259,13 +300,7 @@ pub struct Config {
259
300
pub cluster_address_offset : NumberFormat ,
260
301
261
302
/// Sort registers and clusters in specified order
262
- pub register_cluster_sorting : Option < Sorting > ,
263
-
264
- /// First write registers or clusters
265
- pub registers_or_clusters_first : Option < RegistersOrClustersFirst > ,
266
-
267
- /// Place derived registers and clusters in the end
268
- pub register_cluster_derived_last : bool ,
303
+ pub register_cluster_sorting : RcSorting ,
269
304
270
305
/// Format of register's name-kind elements
271
306
/// - `derivedFrom`
@@ -304,10 +339,7 @@ pub struct Config {
304
339
pub field_bit_range : Option < FieldBitRangeFormat > ,
305
340
306
341
/// Sort fields in specified order
307
- pub field_sorting : Option < Sorting > ,
308
-
309
- /// Place derived fields in the end
310
- pub field_derived_last : bool ,
342
+ pub field_sorting : DerivableSorting ,
311
343
312
344
/// Format of enumeratedValues's name-kind elements
313
345
/// - `derivedFrom`
@@ -342,25 +374,21 @@ impl Default for Config {
342
374
Self {
343
375
peripheral_name : None ,
344
376
peripheral_base_address : NumberFormat :: UpperHex8 ,
345
- peripheral_sorting : None ,
346
- peripheral_derived_last : false ,
377
+ peripheral_sorting : Default :: default ( ) ,
347
378
address_block_offset : NumberFormat :: UpperHex ,
348
379
address_block_size : NumberFormat :: UpperHex ,
349
380
interrupt_name : None ,
350
381
cluster_name : None ,
351
382
cluster_address_offset : NumberFormat :: UpperHex ,
352
- register_cluster_sorting : None ,
353
- registers_or_clusters_first : None ,
354
- register_cluster_derived_last : false ,
383
+ register_cluster_sorting : Default :: default ( ) ,
355
384
register_name : None ,
356
385
register_address_offset : NumberFormat :: UpperHex ,
357
386
register_size : NumberFormat :: LowerHex ,
358
387
register_reset_value : NumberFormat :: UpperHex16 ,
359
388
register_reset_mask : NumberFormat :: UpperHex16 ,
360
389
field_name : None ,
361
390
field_bit_range : None ,
362
- field_sorting : None ,
363
- field_derived_last : false ,
391
+ field_sorting : Default :: default ( ) ,
364
392
enumerated_values_name : None ,
365
393
enumerated_value_name : None ,
366
394
enumerated_value_value : NumberFormat :: Dec ,
@@ -379,31 +407,21 @@ impl Config {
379
407
match name {
380
408
"peripheral_name" => self . peripheral_name = Some ( value. parse ( ) . unwrap ( ) ) ,
381
409
"peripheral_base_address" => self . peripheral_base_address = value. parse ( ) . unwrap ( ) ,
382
- "peripheral_sorting" => self . peripheral_sorting = Some ( value. parse ( ) . unwrap ( ) ) ,
383
- "peripheral_derived_last" => self . peripheral_derived_last = value. parse ( ) . unwrap ( ) ,
410
+ "peripheral_sorting" => self . peripheral_sorting = value. parse ( ) . unwrap ( ) ,
384
411
"address_block_offset" => self . address_block_offset = value. parse ( ) . unwrap ( ) ,
385
412
"address_block_size" => self . address_block_size = value. parse ( ) . unwrap ( ) ,
386
413
"interrupt_name" => self . interrupt_name = Some ( value. parse ( ) . unwrap ( ) ) ,
387
414
"cluster_name" => self . cluster_name = Some ( value. parse ( ) . unwrap ( ) ) ,
388
415
"cluster_address_offset" => self . cluster_address_offset = value. parse ( ) . unwrap ( ) ,
389
- "register_cluster_sorting" => {
390
- self . register_cluster_sorting = Some ( value. parse ( ) . unwrap ( ) )
391
- }
392
- "registers_or_clusters_first" => {
393
- self . registers_or_clusters_first = Some ( value. parse ( ) . unwrap ( ) )
394
- }
395
- "register_cluster_derived_last" => {
396
- self . register_cluster_derived_last = value. parse ( ) . unwrap ( )
397
- }
416
+ "register_cluster_sorting" => self . register_cluster_sorting = value. parse ( ) . unwrap ( ) ,
398
417
"register_name" => self . register_name = Some ( value. parse ( ) . unwrap ( ) ) ,
399
418
"register_address_offset" => self . register_address_offset = value. parse ( ) . unwrap ( ) ,
400
419
"register_size" => self . register_size = value. parse ( ) . unwrap ( ) ,
401
420
"register_reset_value" => self . register_reset_value = value. parse ( ) . unwrap ( ) ,
402
421
"register_reset_mask" => self . register_reset_mask = value. parse ( ) . unwrap ( ) ,
403
422
"field_name" => self . field_name = Some ( value. parse ( ) . unwrap ( ) ) ,
404
423
"field_bit_range" => self . field_bit_range = Some ( value. parse ( ) . unwrap ( ) ) ,
405
- "field_sorting" => self . field_sorting = Some ( value. parse ( ) . unwrap ( ) ) ,
406
- "field_derived_last" => self . field_derived_last = value. parse ( ) . unwrap ( ) ,
424
+ "field_sorting" => self . field_sorting = value. parse ( ) . unwrap ( ) ,
407
425
"enumerated_values_name" => self . enumerated_values_name = Some ( value. parse ( ) . unwrap ( ) ) ,
408
426
"enumerated_value_name" => self . enumerated_value_name = Some ( value. parse ( ) . unwrap ( ) ) ,
409
427
"enumerated_value_value" => self . enumerated_value_value = value. parse ( ) . unwrap ( ) ,
@@ -435,19 +453,11 @@ impl Config {
435
453
/// Sort peripherals in specified order
436
454
///
437
455
/// `None` means keep the original order
438
- pub fn peripheral_sorting ( mut self , val : Option < Sorting > ) -> Self {
456
+ pub fn peripheral_sorting ( mut self , val : DerivableSorting ) -> Self {
439
457
self . peripheral_sorting = val;
440
458
self
441
459
}
442
460
443
- /// Place derived peripherals in the end
444
- ///
445
- /// `false` means keep the original order
446
- pub fn peripheral_derived_last ( mut self , val : bool ) -> Self {
447
- self . peripheral_derived_last = val;
448
- self
449
- }
450
-
451
461
/// Format of addressBlock's offset element
452
462
///
453
463
/// format: hex, dec
@@ -487,27 +497,11 @@ impl Config {
487
497
/// Sort registers and clusters in specified order
488
498
///
489
499
/// `None` means keep the original order
490
- pub fn register_cluster_sorting ( mut self , val : Option < Sorting > ) -> Self {
500
+ pub fn register_cluster_sorting ( mut self , val : RcSorting ) -> Self {
491
501
self . register_cluster_sorting = val;
492
502
self
493
503
}
494
504
495
- /// First write registers or clusters
496
- ///
497
- /// `None` means only `register_cluster_sorting` does matter
498
- pub fn registers_or_clusters_first ( mut self , val : Option < RegistersOrClustersFirst > ) -> Self {
499
- self . registers_or_clusters_first = val;
500
- self
501
- }
502
-
503
- /// Place derived registers and clusters in the end
504
- ///
505
- /// `false` means keep the original order
506
- pub fn register_cluster_derived_last ( mut self , val : bool ) -> Self {
507
- self . register_cluster_derived_last = val;
508
- self
509
- }
510
-
511
505
/// Format of register's name-kind elements
512
506
pub fn register_name ( mut self , val : Option < IdentifierFormat > ) -> Self {
513
507
self . register_name = val;
@@ -563,19 +557,11 @@ impl Config {
563
557
/// Sort fields in specified order
564
558
///
565
559
/// `None` means keep the original order
566
- pub fn field_sorting ( mut self , val : Option < Sorting > ) -> Self {
560
+ pub fn field_sorting ( mut self , val : DerivableSorting ) -> Self {
567
561
self . field_sorting = val;
568
562
self
569
563
}
570
564
571
- /// Place derived fields in the end
572
- ///
573
- /// `false` means keep the original order
574
- pub fn field_derived_last ( mut self , val : bool ) -> Self {
575
- self . field_derived_last = val;
576
- self
577
- }
578
-
579
565
/// Format of enumeratedValues's name-kind elements
580
566
pub fn enumerated_values_name ( mut self , val : Option < IdentifierFormat > ) -> Self {
581
567
self . enumerated_values_name = val;
0 commit comments