@@ -78,16 +78,22 @@ impl Commands {
78
78
. filter ( |segment| segment. len ( ) > 0 )
79
79
. enumerate ( )
80
80
. for_each ( |( i, segment) | {
81
- if let Some ( name ) = key_value_pair ( segment) {
81
+ if let Some ( kv_pair ) = key_value_pair ( segment) {
82
82
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
+ } ;
84
87
self . state_machine . add_next_state ( state, lambda) ;
85
88
opt_final_states. push ( state) ;
86
89
} else {
87
90
opt_final_states. push ( state) ;
88
91
state = self . add_space ( state, i) ;
89
92
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
+ } ;
91
97
self . state_machine
92
98
. add_next_state ( state, opt_lambda_state. unwrap ( ) ) ;
93
99
opt_final_states. push ( state) ;
@@ -330,18 +336,45 @@ impl Commands {
330
336
331
337
state
332
338
}
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 ) ,
333
361
}
334
362
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
+ }
347
380
}
0 commit comments