@@ -10,8 +10,8 @@ use quote::ToTokens;
10
10
use svd_parser:: derive_from:: DeriveFrom ;
11
11
use syn:: { parse_str, Token } ;
12
12
13
- use crate :: errors:: * ;
14
13
use crate :: util:: { self , ToSanitizedSnakeCase , ToSanitizedUpperCase , BITS_PER_BYTE } ;
14
+ use anyhow:: { anyhow, bail, Context , Result } ;
15
15
16
16
use crate :: generate:: register;
17
17
@@ -31,11 +31,10 @@ pub fn render(
31
31
let p_merged = p_derivedfrom. map ( |ancestor| p_original. derive_from ( ancestor) ) ;
32
32
let p = p_merged. as_ref ( ) . unwrap_or ( p_original) ;
33
33
34
- if p_original. derived_from . is_some ( ) && p_derivedfrom. is_none ( ) {
34
+ if let ( Some ( df ) , None ) = ( p_original. derived_from . as_ref ( ) , & p_derivedfrom) {
35
35
eprintln ! (
36
36
"Couldn't find derivedFrom original: {} for {}, skipping" ,
37
- p_original. derived_from. as_ref( ) . unwrap( ) ,
38
- p_original. name
37
+ df, p_original. name
39
38
) ;
40
39
return Ok ( out) ;
41
40
}
@@ -44,13 +43,12 @@ pub fn render(
44
43
let name_pc = Ident :: new ( & p. name . to_sanitized_upper_case ( ) , span) ;
45
44
let address = util:: hex ( p. base_address as u64 ) ;
46
45
let description = util:: respace ( p. description . as_ref ( ) . unwrap_or ( & p. name ) ) ;
47
- let derive_regs = p_derivedfrom. is_some ( ) && p_original. registers . is_none ( ) ;
48
46
49
47
let name_sc = Ident :: new ( & p. name . to_sanitized_snake_case ( ) , span) ;
50
- let base = if derive_regs {
51
- Ident :: new ( & p_derivedfrom . unwrap ( ) . name . to_sanitized_snake_case ( ) , span)
48
+ let ( derive_regs , base) = if let ( Some ( df ) , None ) = ( p_derivedfrom , & p_original . registers ) {
49
+ ( true , Ident :: new ( & df . name . to_sanitized_snake_case ( ) , span) )
52
50
} else {
53
- name_sc. clone ( )
51
+ ( false , name_sc. clone ( ) )
54
52
} ;
55
53
56
54
// Insert the peripheral structure
@@ -607,11 +605,11 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
607
605
let defs = cluster. default_register_properties . derive_from ( defs) ;
608
606
609
607
let cluster_size = cluster_size_in_bits ( cluster, & defs)
610
- . chain_err ( || format ! ( "Cluster {} has no determinable `size` field" , cluster. name) ) ?;
608
+ . with_context ( || format ! ( "Cluster {} has no determinable `size` field" , cluster. name) ) ?;
611
609
612
610
match cluster {
613
611
Cluster :: Single ( info) => cluster_expanded. push ( RegisterBlockField {
614
- field : convert_svd_cluster ( cluster) ,
612
+ field : convert_svd_cluster ( cluster) ? ,
615
613
description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
616
614
offset : info. address_offset ,
617
615
size : cluster_size,
@@ -631,13 +629,13 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
631
629
632
630
if array_convertible {
633
631
cluster_expanded. push ( RegisterBlockField {
634
- field : convert_svd_cluster ( & cluster) ,
632
+ field : convert_svd_cluster ( & cluster) ? ,
635
633
description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
636
634
offset : info. address_offset ,
637
635
size : cluster_size * array_info. dim ,
638
636
} ) ;
639
637
} else {
640
- for ( field_num, field) in expand_svd_cluster ( cluster) . iter ( ) . enumerate ( ) {
638
+ for ( field_num, field) in expand_svd_cluster ( cluster) ? . iter ( ) . enumerate ( ) {
641
639
cluster_expanded. push ( RegisterBlockField {
642
640
field : field. clone ( ) ,
643
641
description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
@@ -664,12 +662,12 @@ fn expand_register(
664
662
let register_size = register
665
663
. size
666
664
. or ( defs. size )
667
- . ok_or_else ( || format ! ( "Register {} has no `size` field" , register. name) ) ?;
665
+ . ok_or_else ( || anyhow ! ( "Register {} has no `size` field" , register. name) ) ?;
668
666
669
667
match register {
670
668
Register :: Single ( info) => register_expanded. push ( RegisterBlockField {
671
- field : convert_svd_register ( register, name) ,
672
- description : info. description . clone ( ) . unwrap_or_else ( || "" . to_string ( ) ) ,
669
+ field : convert_svd_register ( register, name) ? ,
670
+ description : info. description . clone ( ) . unwrap_or_default ( ) ,
673
671
offset : info. address_offset ,
674
672
size : register_size,
675
673
} ) ,
@@ -688,16 +686,16 @@ fn expand_register(
688
686
689
687
if array_convertible {
690
688
register_expanded. push ( RegisterBlockField {
691
- field : convert_svd_register ( & register, name) ,
692
- description : info. description . clone ( ) . unwrap_or_else ( || "" . to_string ( ) ) ,
689
+ field : convert_svd_register ( & register, name) ? ,
690
+ description : info. description . clone ( ) . unwrap_or_default ( ) ,
693
691
offset : info. address_offset ,
694
692
size : register_size * array_info. dim ,
695
693
} ) ;
696
694
} else {
697
- for ( field_num, field) in expand_svd_register ( register, name) . iter ( ) . enumerate ( ) {
695
+ for ( field_num, field) in expand_svd_register ( register, name) ? . iter ( ) . enumerate ( ) {
698
696
register_expanded. push ( RegisterBlockField {
699
697
field : field. clone ( ) ,
700
- description : info. description . clone ( ) . unwrap_or_else ( || "" . to_string ( ) ) ,
698
+ description : info. description . clone ( ) . unwrap_or_default ( ) ,
701
699
offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
702
700
size : register_size,
703
701
} ) ;
@@ -768,8 +766,11 @@ fn cluster_block(
768
766
769
767
/// Takes a svd::Register which may be a register array, and turn in into
770
768
/// a list of syn::Field where the register arrays have been expanded.
771
- fn expand_svd_register ( register : & Register , name : Option < & str > ) -> Vec < syn:: Field > {
772
- let name_to_ty = |name : & String , ns : Option < & str > | -> syn:: Type {
769
+ fn expand_svd_register (
770
+ register : & Register ,
771
+ name : Option < & str > ,
772
+ ) -> Result < Vec < syn:: Field > , syn:: Error > {
773
+ let name_to_ty = |name : & String , ns : Option < & str > | -> Result < syn:: Type , syn:: Error > {
773
774
let ident = if let Some ( ns) = ns {
774
775
Cow :: Owned (
775
776
String :: from ( "self::" )
@@ -781,13 +782,13 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
781
782
name. to_sanitized_upper_case ( )
782
783
} ;
783
784
784
- syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & ident) . unwrap ( ) )
785
+ Ok ( syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & ident) ? ) )
785
786
} ;
786
787
787
788
let mut out = vec ! [ ] ;
788
789
789
790
match register {
790
- Register :: Single ( _info) => out. push ( convert_svd_register ( register, name) ) ,
791
+ Register :: Single ( _info) => out. push ( convert_svd_register ( register, name) ? ) ,
791
792
Register :: Array ( info, array_info) => {
792
793
let indices = array_info
793
794
. dim_index
@@ -806,17 +807,17 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
806
807
for ( idx, _i) in indices. iter ( ) . zip ( 0 ..) {
807
808
let nb_name = util:: replace_suffix ( & info. name , idx) ;
808
809
809
- let ty = name_to_ty ( & ty_name, name) ;
810
+ let ty = name_to_ty ( & ty_name, name) ? ;
810
811
811
812
out. push ( new_syn_field ( & nb_name. to_sanitized_snake_case ( ) , ty) ) ;
812
813
}
813
814
}
814
815
}
815
- out
816
+ Ok ( out)
816
817
}
817
818
818
819
/// Convert a parsed `Register` into its `Field` equivalent
819
- fn convert_svd_register ( register : & Register , name : Option < & str > ) -> syn:: Field {
820
+ fn convert_svd_register ( register : & Register , name : Option < & str > ) -> Result < syn:: Field , syn :: Error > {
820
821
let name_to_ty = |name : & String , ns : Option < & str > | -> String {
821
822
if let Some ( ns) = ns {
822
823
String :: from ( "self::" )
@@ -828,39 +829,38 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
828
829
}
829
830
} ;
830
831
831
- match register {
832
+ Ok ( match register {
832
833
Register :: Single ( info) => new_syn_field (
833
834
& info. name . to_sanitized_snake_case ( ) ,
834
- syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & name_to_ty ( & info. name , name) ) . unwrap ( ) ) ,
835
+ syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & name_to_ty ( & info. name , name) ) ? ) ,
835
836
) ,
836
837
Register :: Array ( info, array_info) => {
837
838
let nb_name = util:: replace_suffix ( & info. name , "" ) ;
838
839
839
- let ty = syn:: Type :: Array (
840
- parse_str :: < syn:: TypeArray > ( & format ! (
841
- "[{};{}]" ,
842
- name_to_ty( & nb_name, name) ,
843
- u64 :: from( array_info. dim)
844
- ) )
845
- . unwrap ( ) ,
846
- ) ;
840
+ let ty = syn:: Type :: Array ( parse_str :: < syn:: TypeArray > ( & format ! (
841
+ "[{};{}]" ,
842
+ name_to_ty( & nb_name, name) ,
843
+ u64 :: from( array_info. dim)
844
+ ) ) ?) ;
847
845
848
846
new_syn_field ( & nb_name. to_sanitized_snake_case ( ) , ty)
849
847
}
850
- }
848
+ } )
851
849
}
852
850
853
851
/// Takes a svd::Cluster which may contain a register array, and turn in into
854
852
/// a list of syn::Field where the register arrays have been expanded.
855
- fn expand_svd_cluster ( cluster : & Cluster ) -> Vec < syn:: Field > {
856
- let name_to_ty = |name : & String | -> syn:: Type {
857
- syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & name. to_sanitized_upper_case ( ) ) . unwrap ( ) )
853
+ fn expand_svd_cluster ( cluster : & Cluster ) -> Result < Vec < syn:: Field > , syn:: Error > {
854
+ let name_to_ty = |name : & String | -> Result < syn:: Type , syn:: Error > {
855
+ Ok ( syn:: Type :: Path ( parse_str :: < syn:: TypePath > (
856
+ & name. to_sanitized_upper_case ( ) ,
857
+ ) ?) )
858
858
} ;
859
859
860
860
let mut out = vec ! [ ] ;
861
861
862
862
match & cluster {
863
- Cluster :: Single ( _info) => out. push ( convert_svd_cluster ( cluster) ) ,
863
+ Cluster :: Single ( _info) => out. push ( convert_svd_cluster ( cluster) ? ) ,
864
864
Cluster :: Array ( info, array_info) => {
865
865
let indices = array_info
866
866
. dim_index
@@ -879,39 +879,36 @@ fn expand_svd_cluster(cluster: &Cluster) -> Vec<syn::Field> {
879
879
for ( idx, _i) in indices. iter ( ) . zip ( 0 ..) {
880
880
let name = util:: replace_suffix ( & info. name , idx) ;
881
881
882
- let ty = name_to_ty ( & ty_name) ;
882
+ let ty = name_to_ty ( & ty_name) ? ;
883
883
884
884
out. push ( new_syn_field ( & name. to_sanitized_snake_case ( ) , ty) ) ;
885
885
}
886
886
}
887
887
}
888
- out
888
+ Ok ( out)
889
889
}
890
890
891
891
/// Convert a parsed `Cluster` into its `Field` equivalent
892
- fn convert_svd_cluster ( cluster : & Cluster ) -> syn:: Field {
893
- match cluster {
892
+ fn convert_svd_cluster ( cluster : & Cluster ) -> Result < syn:: Field , syn :: Error > {
893
+ Ok ( match cluster {
894
894
Cluster :: Single ( info) => new_syn_field (
895
895
& info. name . to_sanitized_snake_case ( ) ,
896
- syn:: Type :: Path (
897
- parse_str :: < syn :: TypePath > ( & info. name . to_sanitized_upper_case ( ) ) . unwrap ( ) ,
898
- ) ,
896
+ syn:: Type :: Path ( parse_str :: < syn :: TypePath > (
897
+ & info. name . to_sanitized_upper_case ( ) ,
898
+ ) ? ) ,
899
899
) ,
900
900
Cluster :: Array ( info, array_info) => {
901
901
let name = util:: replace_suffix ( & info. name , "" ) ;
902
902
903
- let ty = syn:: Type :: Array (
904
- parse_str :: < syn:: TypeArray > ( & format ! (
905
- "[{};{}]" ,
906
- & name. to_sanitized_upper_case( ) ,
907
- u64 :: from( array_info. dim)
908
- ) )
909
- . unwrap ( ) ,
910
- ) ;
903
+ let ty = syn:: Type :: Array ( parse_str :: < syn:: TypeArray > ( & format ! (
904
+ "[{};{}]" ,
905
+ & name. to_sanitized_upper_case( ) ,
906
+ u64 :: from( array_info. dim)
907
+ ) ) ?) ;
911
908
912
909
new_syn_field ( & name. to_sanitized_snake_case ( ) , ty)
913
910
}
914
- }
911
+ } )
915
912
}
916
913
917
914
fn new_syn_field ( ident : & str , ty : syn:: Type ) -> syn:: Field {
0 commit comments