@@ -178,34 +178,78 @@ pub enum Sorting {
178178 Name ,
179179}
180180
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 {
182213 type Err = ( ) ;
183214
184215 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 )
191224 }
192225}
193226
194227#[ 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 ) ,
198232}
199233
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 {
201241 type Err = ( ) ;
202242
203243 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+ } )
209253 }
210254}
211255
@@ -228,10 +272,7 @@ pub struct Config {
228272 pub peripheral_base_address : NumberFormat ,
229273
230274 /// 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 ,
235276
236277 /// Format of addressBlock's offset element
237278 ///
@@ -259,13 +300,7 @@ pub struct Config {
259300 pub cluster_address_offset : NumberFormat ,
260301
261302 /// 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 ,
269304
270305 /// Format of register's name-kind elements
271306 /// - `derivedFrom`
@@ -304,10 +339,7 @@ pub struct Config {
304339 pub field_bit_range : Option < FieldBitRangeFormat > ,
305340
306341 /// 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 ,
311343
312344 /// Format of enumeratedValues's name-kind elements
313345 /// - `derivedFrom`
@@ -342,25 +374,21 @@ impl Default for Config {
342374 Self {
343375 peripheral_name : None ,
344376 peripheral_base_address : NumberFormat :: UpperHex8 ,
345- peripheral_sorting : None ,
346- peripheral_derived_last : false ,
377+ peripheral_sorting : Default :: default ( ) ,
347378 address_block_offset : NumberFormat :: UpperHex ,
348379 address_block_size : NumberFormat :: UpperHex ,
349380 interrupt_name : None ,
350381 cluster_name : None ,
351382 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 ( ) ,
355384 register_name : None ,
356385 register_address_offset : NumberFormat :: UpperHex ,
357386 register_size : NumberFormat :: LowerHex ,
358387 register_reset_value : NumberFormat :: UpperHex16 ,
359388 register_reset_mask : NumberFormat :: UpperHex16 ,
360389 field_name : None ,
361390 field_bit_range : None ,
362- field_sorting : None ,
363- field_derived_last : false ,
391+ field_sorting : Default :: default ( ) ,
364392 enumerated_values_name : None ,
365393 enumerated_value_name : None ,
366394 enumerated_value_value : NumberFormat :: Dec ,
@@ -379,31 +407,21 @@ impl Config {
379407 match name {
380408 "peripheral_name" => self . peripheral_name = Some ( value. parse ( ) . unwrap ( ) ) ,
381409 "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 ( ) ,
384411 "address_block_offset" => self . address_block_offset = value. parse ( ) . unwrap ( ) ,
385412 "address_block_size" => self . address_block_size = value. parse ( ) . unwrap ( ) ,
386413 "interrupt_name" => self . interrupt_name = Some ( value. parse ( ) . unwrap ( ) ) ,
387414 "cluster_name" => self . cluster_name = Some ( value. parse ( ) . unwrap ( ) ) ,
388415 "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 ( ) ,
398417 "register_name" => self . register_name = Some ( value. parse ( ) . unwrap ( ) ) ,
399418 "register_address_offset" => self . register_address_offset = value. parse ( ) . unwrap ( ) ,
400419 "register_size" => self . register_size = value. parse ( ) . unwrap ( ) ,
401420 "register_reset_value" => self . register_reset_value = value. parse ( ) . unwrap ( ) ,
402421 "register_reset_mask" => self . register_reset_mask = value. parse ( ) . unwrap ( ) ,
403422 "field_name" => self . field_name = Some ( value. parse ( ) . unwrap ( ) ) ,
404423 "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 ( ) ,
407425 "enumerated_values_name" => self . enumerated_values_name = Some ( value. parse ( ) . unwrap ( ) ) ,
408426 "enumerated_value_name" => self . enumerated_value_name = Some ( value. parse ( ) . unwrap ( ) ) ,
409427 "enumerated_value_value" => self . enumerated_value_value = value. parse ( ) . unwrap ( ) ,
@@ -435,19 +453,11 @@ impl Config {
435453 /// Sort peripherals in specified order
436454 ///
437455 /// `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 {
439457 self . peripheral_sorting = val;
440458 self
441459 }
442460
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-
451461 /// Format of addressBlock's offset element
452462 ///
453463 /// format: hex, dec
@@ -487,27 +497,11 @@ impl Config {
487497 /// Sort registers and clusters in specified order
488498 ///
489499 /// `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 {
491501 self . register_cluster_sorting = val;
492502 self
493503 }
494504
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-
511505 /// Format of register's name-kind elements
512506 pub fn register_name ( mut self , val : Option < IdentifierFormat > ) -> Self {
513507 self . register_name = val;
@@ -563,19 +557,11 @@ impl Config {
563557 /// Sort fields in specified order
564558 ///
565559 /// `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 {
567561 self . field_sorting = val;
568562 self
569563 }
570564
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-
579565 /// Format of enumeratedValues's name-kind elements
580566 pub fn enumerated_values_name ( mut self , val : Option < IdentifierFormat > ) -> Self {
581567 self . enumerated_values_name = val;
0 commit comments