@@ -10,8 +10,8 @@ use quote::ToTokens;
1010use svd_parser:: derive_from:: DeriveFrom ;
1111use syn:: { parse_str, Token } ;
1212
13- use crate :: errors:: * ;
1413use crate :: util:: { self , ToSanitizedSnakeCase , ToSanitizedUpperCase , BITS_PER_BYTE } ;
14+ use anyhow:: { anyhow, bail, Context , Result } ;
1515
1616use crate :: generate:: register;
1717
@@ -31,11 +31,10 @@ pub fn render(
3131 let p_merged = p_derivedfrom. map ( |ancestor| p_original. derive_from ( ancestor) ) ;
3232 let p = p_merged. as_ref ( ) . unwrap_or ( p_original) ;
3333
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) {
3535 eprintln ! (
3636 "Couldn't find derivedFrom original: {} for {}, skipping" ,
37- p_original. derived_from. as_ref( ) . unwrap( ) ,
38- p_original. name
37+ df, p_original. name
3938 ) ;
4039 return Ok ( out) ;
4140 }
@@ -44,13 +43,12 @@ pub fn render(
4443 let name_pc = Ident :: new ( & p. name . to_sanitized_upper_case ( ) , span) ;
4544 let address = util:: hex ( p. base_address as u64 ) ;
4645 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 ( ) ;
4846
4947 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) )
5250 } else {
53- name_sc. clone ( )
51+ ( false , name_sc. clone ( ) )
5452 } ;
5553
5654 // Insert the peripheral structure
@@ -607,11 +605,11 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
607605 let defs = cluster. default_register_properties . derive_from ( defs) ;
608606
609607 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) ) ?;
611609
612610 match cluster {
613611 Cluster :: Single ( info) => cluster_expanded. push ( RegisterBlockField {
614- field : convert_svd_cluster ( cluster) ,
612+ field : convert_svd_cluster ( cluster) ? ,
615613 description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
616614 offset : info. address_offset ,
617615 size : cluster_size,
@@ -631,13 +629,13 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
631629
632630 if array_convertible {
633631 cluster_expanded. push ( RegisterBlockField {
634- field : convert_svd_cluster ( & cluster) ,
632+ field : convert_svd_cluster ( & cluster) ? ,
635633 description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
636634 offset : info. address_offset ,
637635 size : cluster_size * array_info. dim ,
638636 } ) ;
639637 } 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 ( ) {
641639 cluster_expanded. push ( RegisterBlockField {
642640 field : field. clone ( ) ,
643641 description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
@@ -664,12 +662,12 @@ fn expand_register(
664662 let register_size = register
665663 . size
666664 . 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) ) ?;
668666
669667 match register {
670668 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 ( ) ,
673671 offset : info. address_offset ,
674672 size : register_size,
675673 } ) ,
@@ -688,16 +686,16 @@ fn expand_register(
688686
689687 if array_convertible {
690688 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 ( ) ,
693691 offset : info. address_offset ,
694692 size : register_size * array_info. dim ,
695693 } ) ;
696694 } 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 ( ) {
698696 register_expanded. push ( RegisterBlockField {
699697 field : field. clone ( ) ,
700- description : info. description . clone ( ) . unwrap_or_else ( || "" . to_string ( ) ) ,
698+ description : info. description . clone ( ) . unwrap_or_default ( ) ,
701699 offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
702700 size : register_size,
703701 } ) ;
@@ -768,8 +766,11 @@ fn cluster_block(
768766
769767/// Takes a svd::Register which may be a register array, and turn in into
770768/// 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 > {
773774 let ident = if let Some ( ns) = ns {
774775 Cow :: Owned (
775776 String :: from ( "self::" )
@@ -781,13 +782,13 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
781782 name. to_sanitized_upper_case ( )
782783 } ;
783784
784- syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & ident) . unwrap ( ) )
785+ Ok ( syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & ident) ? ) )
785786 } ;
786787
787788 let mut out = vec ! [ ] ;
788789
789790 match register {
790- Register :: Single ( _info) => out. push ( convert_svd_register ( register, name) ) ,
791+ Register :: Single ( _info) => out. push ( convert_svd_register ( register, name) ? ) ,
791792 Register :: Array ( info, array_info) => {
792793 let indices = array_info
793794 . dim_index
@@ -806,17 +807,17 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
806807 for ( idx, _i) in indices. iter ( ) . zip ( 0 ..) {
807808 let nb_name = util:: replace_suffix ( & info. name , idx) ;
808809
809- let ty = name_to_ty ( & ty_name, name) ;
810+ let ty = name_to_ty ( & ty_name, name) ? ;
810811
811812 out. push ( new_syn_field ( & nb_name. to_sanitized_snake_case ( ) , ty) ) ;
812813 }
813814 }
814815 }
815- out
816+ Ok ( out)
816817}
817818
818819/// 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 > {
820821 let name_to_ty = |name : & String , ns : Option < & str > | -> String {
821822 if let Some ( ns) = ns {
822823 String :: from ( "self::" )
@@ -828,39 +829,38 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
828829 }
829830 } ;
830831
831- match register {
832+ Ok ( match register {
832833 Register :: Single ( info) => new_syn_field (
833834 & 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) ) ? ) ,
835836 ) ,
836837 Register :: Array ( info, array_info) => {
837838 let nb_name = util:: replace_suffix ( & info. name , "" ) ;
838839
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+ ) ) ?) ;
847845
848846 new_syn_field ( & nb_name. to_sanitized_snake_case ( ) , ty)
849847 }
850- }
848+ } )
851849}
852850
853851/// Takes a svd::Cluster which may contain a register array, and turn in into
854852/// 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+ ) ?) )
858858 } ;
859859
860860 let mut out = vec ! [ ] ;
861861
862862 match & cluster {
863- Cluster :: Single ( _info) => out. push ( convert_svd_cluster ( cluster) ) ,
863+ Cluster :: Single ( _info) => out. push ( convert_svd_cluster ( cluster) ? ) ,
864864 Cluster :: Array ( info, array_info) => {
865865 let indices = array_info
866866 . dim_index
@@ -879,39 +879,36 @@ fn expand_svd_cluster(cluster: &Cluster) -> Vec<syn::Field> {
879879 for ( idx, _i) in indices. iter ( ) . zip ( 0 ..) {
880880 let name = util:: replace_suffix ( & info. name , idx) ;
881881
882- let ty = name_to_ty ( & ty_name) ;
882+ let ty = name_to_ty ( & ty_name) ? ;
883883
884884 out. push ( new_syn_field ( & name. to_sanitized_snake_case ( ) , ty) ) ;
885885 }
886886 }
887887 }
888- out
888+ Ok ( out)
889889}
890890
891891/// 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 {
894894 Cluster :: Single ( info) => new_syn_field (
895895 & 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+ ) ? ) ,
899899 ) ,
900900 Cluster :: Array ( info, array_info) => {
901901 let name = util:: replace_suffix ( & info. name , "" ) ;
902902
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+ ) ) ?) ;
911908
912909 new_syn_field ( & name. to_sanitized_snake_case ( ) , ty)
913910 }
914- }
911+ } )
915912}
916913
917914fn new_syn_field ( ident : & str , ty : syn:: Type ) -> syn:: Field {
0 commit comments