@@ -65,7 +65,7 @@ impl Commands {
6565 info ! ( "Adding command {}" , & command) ;
6666 let mut state = 0 ;
6767
68- let mut opt_lambda_state = None ;
68+ let mut reused_space_state = None ;
6969 let mut opt_final_states = vec ! [ ] ;
7070
7171 let handler = Arc :: new ( Command {
@@ -78,28 +78,32 @@ impl Commands {
7878 . filter ( |segment| segment. len ( ) > 0 )
7979 . enumerate ( )
8080 . for_each ( |( i, segment) | {
81- if let Some ( kv_pair) = key_value_pair ( segment) {
82- if let Some ( lambda) = opt_lambda_state {
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- } ;
81+ if let Some ( name) = key_value_pair ( segment) {
82+ if let Some ( lambda) = reused_space_state {
83+ state = self . add_key_value ( name, lambda) ;
84+ self . state_machine . add_next_state ( state, lambda) ;
85+ opt_final_states. push ( state) ;
86+
87+ state = self . add_quoted_key_value ( name, lambda) ;
8788 self . state_machine . add_next_state ( state, lambda) ;
8889 opt_final_states. push ( state) ;
8990 } else {
9091 opt_final_states. push ( state) ;
9192 state = self . add_space ( state, i) ;
92- opt_lambda_state = Some ( 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- } ;
93+ reused_space_state = Some ( state) ;
94+
95+ state = self . add_key_value ( name, state) ;
9796 self . state_machine
98- . add_next_state ( state, opt_lambda_state. unwrap ( ) ) ;
97+ . add_next_state ( state, reused_space_state. unwrap ( ) ) ;
98+ opt_final_states. push ( state) ;
99+
100+ state = self . add_quoted_key_value ( name, reused_space_state. unwrap ( ) ) ;
101+ self . state_machine
102+ . add_next_state ( state, reused_space_state. unwrap ( ) ) ;
99103 opt_final_states. push ( state) ;
100104 }
101105 } else {
102- opt_lambda_state = None ;
106+ reused_space_state = None ;
103107 opt_final_states. truncate ( 0 ) ;
104108 let last_state = state;
105109 state = self . add_space ( state, i) ;
@@ -128,7 +132,7 @@ impl Commands {
128132 }
129133 } ) ;
130134
131- if opt_lambda_state . is_some ( ) {
135+ if reused_space_state . is_some ( ) {
132136 opt_final_states. iter ( ) . for_each ( |state| {
133137 self . state_machine . set_final_state ( * state) ;
134138 self . state_machine . set_handler ( * state, handler. clone ( ) ) ;
@@ -328,7 +332,7 @@ impl Commands {
328332 state = self . state_machine . add ( state, CharacterSet :: from_char ( '=' ) ) ;
329333
330334 let mut char_set = CharacterSet :: any ( ) ;
331- char_set. remove ( & [ ' ' , '\n' ] ) ;
335+ char_set. remove ( & [ ' ' , '\n' , '"' ] ) ;
332336 state = self . state_machine . add ( state, char_set) ;
333337 self . state_machine . add_next_state ( state, state) ;
334338 self . state_machine . start_parse ( state, name) ;
@@ -344,7 +348,9 @@ impl Commands {
344348 state = self . state_machine . add ( state, CharacterSet :: from_char ( '=' ) ) ;
345349 state = self . state_machine . add ( state, CharacterSet :: from_char ( '"' ) ) ;
346350
347- state = self . state_machine . add ( state, CharacterSet :: any ( ) ) ;
351+ let mut char_set = CharacterSet :: any ( ) ;
352+ char_set. remove ( & [ '"' ] ) ;
353+ state = self . state_machine . add ( state, char_set) ;
348354 self . state_machine . add_next_state ( state, state) ;
349355 self . state_machine . start_parse ( state, name) ;
350356 self . state_machine . end_parse ( state) ;
@@ -355,26 +361,16 @@ impl Commands {
355361 }
356362}
357363
358- enum KeyValuePair {
359- Quoted ( & ' static str ) ,
360- Unquoted ( & ' static str ) ,
361- }
362-
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- }
364+ fn key_value_pair ( s : & ' static str ) -> Option < & ' static str > {
365+ s. match_indices ( "={}" )
366+ . next ( )
367+ . map ( |pair| {
368+ let name = & s[ 0 ..pair. 0 ] ;
369+ if name. len ( ) > 0 {
370+ Some ( name)
371+ } else {
372+ None
373+ }
374+ } )
375+ . flatten ( )
380376}
0 commit comments