Properly parse path separators in format-like postfix

This commit is contained in:
Lukas Wirth 2020-12-29 12:54:48 +01:00
parent 77ad203a71
commit ddc25d87ca

View file

@ -108,7 +108,8 @@ impl FormatStrParser {
// "{MyStruct { val_a: 0, val_b: 1 }}".
let mut inexpr_open_count = 0;
for chr in self.input.chars() {
let mut chars = self.input.chars().peekable();
while let Some(chr) = chars.next() {
match (self.state, chr) {
(State::NotExpr, '{') => {
self.output.push(chr);
@ -157,6 +158,11 @@ impl FormatStrParser {
inexpr_open_count -= 1;
}
}
(State::Expr, ':') if chars.peek().copied() == Some(':') => {
// path seperator
current_expr.push_str("::");
chars.next();
}
(State::Expr, ':') => {
if inexpr_open_count == 0 {
// We're outside of braces, thus assume that it's a specifier, like "{Some(value):?}"
@ -249,6 +255,9 @@ mod tests {
expect![["{:?}; SomeStruct { val_a: 0, val_b: 1 }"]],
),
("{ 2 + 2 }", expect![["{}; 2 + 2"]]),
("{strsim::jaro_winkle(a)}", expect![["{}; strsim::jaro_winkle(a)"]]),
("{foo::bar::baz()}", expect![["{}; foo::bar::baz()"]]),
("{foo::bar():?}", expect![["{:?}; foo::bar()"]]),
];
for (input, output) in test_vector {