File tree Expand file tree Collapse file tree 6 files changed +23
-24
lines changed Expand file tree Collapse file tree 6 files changed +23
-24
lines changed Original file line number Diff line number Diff line change @@ -22,6 +22,8 @@ xmltree = "0.8"
2222anyhow  = " 1.0.19" 
2323thiserror  = " 1.0.5" 
2424rayon  = " 1.3.0" 
25+ once_cell  = " 1.3.1" 
26+ regex  = " 1" 
2527
2628[dependencies .serde ]
2729version  = " 1.0" 
Original file line number Diff line number Diff line change 22//! This module defines error types and messages for SVD parsing and encoding 
33
44pub  use  anyhow:: { Context ,  Result } ; 
5+ use  once_cell:: sync:: Lazy ; 
6+ use  regex:: Regex ; 
57use  xmltree:: Element ; 
68
79#[ allow( clippy:: large_enum_variant) ]  
@@ -72,25 +74,20 @@ pub enum NameError {
7274    Invalid ( String ,  String ) , 
7375} 
7476
75- pub ( crate )  fn  is_valid_name ( name :  & str )  -> bool  { 
76-     let  mut  chars = name. chars ( ) ; 
77-     if  let  Some ( first)  = chars. next ( )  { 
78-         if  !( first. is_ascii_alphabetic ( )  || first == '_' )  { 
79-             return  false ; 
80-         } 
81-         for  c in  chars { 
82-             if  !( c. is_ascii_alphanumeric ( )  || c == '_'  || c == '%' )  { 
83-                 return  false ; 
84-             } 
85-         } 
86-         true 
77+ pub ( crate )  fn  check_name ( name :  & str ,  tag :  & str )  -> Result < ( ) >  { 
78+     static  PATTERN :  Lazy < Regex >  = Lazy :: new ( || Regex :: new ( "^[_A-Za-z0-9]*$" ) . unwrap ( ) ) ; 
79+     if  PATTERN . is_match ( name)  { 
80+         Ok ( ( ) ) 
8781    }  else  { 
88-         false 
82+         Err ( NameError :: Invalid ( name . to_string ( ) ,  tag . to_string ( ) ) . into ( ) ) 
8983    } 
9084} 
9185
92- pub ( crate )  fn  check_name ( name :  & str ,  tag :  & str )  -> Result < ( ) >  { 
93-     if  is_valid_name ( name)  { 
86+ pub ( crate )  fn  check_dimable_name ( name :  & str ,  tag :  & str )  -> Result < ( ) >  { 
87+     static  PATTERN :  Lazy < Regex >  = Lazy :: new ( || { 
88+         Regex :: new ( "^((%s)|(%s)[_A-Za-z]{1}[_A-Za-z0-9]*)|([_A-Za-z]{1}[_A-Za-z0-9]*(\\ [%s\\ ])?)|([_A-Za-z]{1}[_A-Za-z0-9]*(%s)?[_A-Za-z0-9]*)$" ) . unwrap ( ) 
89+     } ) ; 
90+     if  PATTERN . is_match ( name)  { 
9491        Ok ( ( ) ) 
9592    }  else  { 
9693        Err ( NameError :: Invalid ( name. to_string ( ) ,  tag. to_string ( ) ) . into ( ) ) 
Original file line number Diff line number Diff line change @@ -109,9 +109,9 @@ impl ClusterInfoBuilder {
109109
110110impl  ClusterInfo  { 
111111    fn  validate ( self )  -> Result < Self >  { 
112-         check_name ( & self . name ,  "name" ) ?; 
112+         check_dimable_name ( & self . name ,  "name" ) ?; 
113113        if  let  Some ( name)  = self . derived_from . as_ref ( )  { 
114-             check_name ( name,  "derivedFrom" ) ?; 
114+             check_dimable_name ( name,  "derivedFrom" ) ?; 
115115        }  else  { 
116116            if  self . children . is_empty ( )  { 
117117                return  Err ( SVDError :: EmptyCluster ) ?; 
Original file line number Diff line number Diff line change @@ -127,9 +127,9 @@ impl FieldInfoBuilder {
127127
128128impl  FieldInfo  { 
129129    fn  validate ( self )  -> Result < Self >  { 
130-         check_name ( & self . name ,  "name" ) ?; 
130+         check_dimable_name ( & self . name ,  "name" ) ?; 
131131        if  let  Some ( name)  = self . derived_from . as_ref ( )  { 
132-             check_name ( name,  "derivedFrom" ) ?; 
132+             check_dimable_name ( name,  "derivedFrom" ) ?; 
133133        } 
134134        for  ev in  & self . enumerated_values  { 
135135            ev. check_range ( 0 ..2_u32 . pow ( self . bit_range . width ) ) ?; 
Original file line number Diff line number Diff line change @@ -159,9 +159,9 @@ impl PeripheralBuilder {
159159impl  Peripheral  { 
160160    fn  validate ( self )  -> Result < Self >  { 
161161        // TODO 
162-         check_name ( & self . name ,  "name" ) ?; 
162+         check_dimable_name ( & self . name ,  "name" ) ?; 
163163        if  let  Some ( name)  = self . derived_from . as_ref ( )  { 
164-             check_name ( name,  "derivedFrom" ) ?; 
164+             check_dimable_name ( name,  "derivedFrom" ) ?; 
165165        }  else  if  let  Some ( registers)  = self . registers . as_ref ( )  { 
166166            if  registers. is_empty ( )  { 
167167                return  Err ( SVDError :: EmptyRegisters ) ?; 
Original file line number Diff line number Diff line change @@ -182,15 +182,15 @@ impl RegisterInfoBuilder {
182182
183183impl  RegisterInfo  { 
184184    fn  validate ( self )  -> Result < Self >  { 
185-         check_name ( & self . name ,  "name" ) ?; 
185+         check_dimable_name ( & self . name ,  "name" ) ?; 
186186        if  let  Some ( name)  = self . alternate_group . as_ref ( )  { 
187187            check_name ( name,  "alternateGroup" ) ?; 
188188        } 
189189        if  let  Some ( name)  = self . alternate_register . as_ref ( )  { 
190-             check_name ( name,  "alternateRegister" ) ?; 
190+             check_dimable_name ( name,  "alternateRegister" ) ?; 
191191        } 
192192        if  let  Some ( name)  = self . derived_from . as_ref ( )  { 
193-             check_name ( name,  "derivedFrom" ) ?; 
193+             check_dimable_name ( name,  "derivedFrom" ) ?; 
194194        }  else  if  let  Some ( fields)  = self . fields . as_ref ( )  { 
195195            if  fields. is_empty ( )  { 
196196                return  Err ( SVDError :: EmptyFields ) ?; 
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments