Skip to content

Commit 3a1bf5c

Browse files
committed
add support for quoted values in key value optionals
1 parent 7f4f21f commit 3a1bf5c

File tree

1 file changed

+48
-15
lines changed

1 file changed

+48
-15
lines changed

src/commands.rs

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)