@@ -78,16 +78,22 @@ impl Commands {
7878 . filter ( |segment| segment. len ( ) > 0 )
7979 . enumerate ( )
8080 . for_each ( |( i, segment) | {
81- if let Some ( name ) = key_value_pair ( segment) {
81+ if let Some ( kv_pair ) = key_value_pair ( segment) {
8282 if let Some ( lambda) = opt_lambda_state {
83- state = self . add_key_value ( name, lambda) ;
83+ state = match kv_pair {
84+ KeyValuePair :: Quoted ( name) => self . add_quoted_key_value ( name, lambda) ,
85+ KeyValuePair :: Unquoted ( name) => self . add_key_value ( name, lambda) ,
86+ } ;
8487 self . state_machine . add_next_state ( state, lambda) ;
8588 opt_final_states. push ( state) ;
8689 } else {
8790 opt_final_states. push ( state) ;
8891 state = self . add_space ( state, i) ;
8992 opt_lambda_state = Some ( state) ;
90- state = self . add_key_value ( name, state) ;
93+ state = match kv_pair {
94+ KeyValuePair :: Quoted ( name) => self . add_quoted_key_value ( name, state) ,
95+ KeyValuePair :: Unquoted ( name) => self . add_key_value ( name, state) ,
96+ } ;
9197 self . state_machine
9298 . add_next_state ( state, opt_lambda_state. unwrap ( ) ) ;
9399 opt_final_states. push ( state) ;
@@ -330,18 +336,45 @@ impl Commands {
330336
331337 state
332338 }
339+
340+ fn add_quoted_key_value ( & mut self , name : & ' static str , mut state : usize ) -> usize {
341+ name. chars ( ) . for_each ( |c| {
342+ state = self . state_machine . add ( state, CharacterSet :: from_char ( c) ) ;
343+ } ) ;
344+ state = self . state_machine . add ( state, CharacterSet :: from_char ( '=' ) ) ;
345+ state = self . state_machine . add ( state, CharacterSet :: from_char ( '"' ) ) ;
346+
347+ state = self . state_machine . add ( state, CharacterSet :: any ( ) ) ;
348+ self . state_machine . add_next_state ( state, state) ;
349+ self . state_machine . start_parse ( state, name) ;
350+ self . state_machine . end_parse ( state) ;
351+
352+ state = self . state_machine . add ( state, CharacterSet :: from_char ( '"' ) ) ;
353+
354+ state
355+ }
356+ }
357+
358+ enum KeyValuePair {
359+ Quoted ( & ' static str ) ,
360+ Unquoted ( & ' static str ) ,
333361}
334362
335- fn key_value_pair ( s : & ' static str ) -> Option < & ' static str > {
336- s. match_indices ( "={}" )
337- . next ( )
338- . map ( |pair| {
339- let name = & s[ 0 ..pair. 0 ] ;
340- if name. len ( ) > 0 {
341- Some ( name)
342- } else {
343- None
344- }
345- } )
346- . flatten ( )
363+ fn key_value_pair ( s : & ' static str ) -> Option < KeyValuePair > {
364+ let len = s. len ( ) ;
365+
366+ if len <= 3 {
367+ return None ;
368+ }
369+
370+ let delim = & s[ len - 3 ..] ;
371+ let key = & s[ ..len - 3 ] ;
372+
373+ if delim == "={}" {
374+ Some ( KeyValuePair :: Unquoted ( key) )
375+ } else if delim == "=[]" {
376+ Some ( KeyValuePair :: Quoted ( key) )
377+ } else {
378+ None
379+ }
347380}
0 commit comments