in starlark/src/values/types/string/interpolation.rs [340:396]
fn next(&mut self) -> anyhow::Result<Option<FormatToken<'a>>> {
let mut i = 0;
while i < self.rem_input.len() {
match self.rem_input.as_bytes()[i] {
b'{' | b'}' if i != 0 => {
let (text, rem) = self.rem_input.split_at(i);
self.rem_input = rem;
return Ok(Some(FormatToken::Text(text)));
}
b'{' => {
assert!(i == 0);
if self.rem_input.starts_with("{{") {
self.rem_input = &self.rem_input[2..];
return Ok(Some(FormatToken::Text("{")));
}
i = 1;
while i < self.rem_input.len() {
match self.rem_input.as_bytes()[i] {
b'}' => {
let capture = &self.rem_input[1..i];
self.rem_input = &self.rem_input[i + 1..];
return Ok(Some(FormatToken::Capture(capture)));
}
b'{' => {
break;
}
_ => i += 1,
}
}
return Err(anyhow!(
"Unmatched '{{' in format string `{}`",
self.format_str
));
}
b'}' => {
assert!(i == 0);
if self.rem_input.starts_with("}}") {
self.rem_input = &self.rem_input[2..];
return Ok(Some(FormatToken::Text("}")));
}
return Err(anyhow!(
"Standalone '}}' in format string `{}`",
self.format_str
));
}
_ => i += 1,
}
}
if i == 0 {
Ok(None)
} else {
let text = mem::take(&mut self.rem_input);
Ok(Some(FormatToken::Text(text)))
}
}