summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tokeniser.rs21
1 files changed, 9 insertions, 12 deletions
diff --git a/src/tokeniser.rs b/src/tokeniser.rs
index 3608e9e..e09a439 100644
--- a/src/tokeniser.rs
+++ b/src/tokeniser.rs
@@ -139,20 +139,17 @@ impl Tokeniser {
return token;
}
- /// Consume and return all characters up to and including the delimiter.
+ /// Return all characters found until the predicate returns true.
/// Returns None if end of source is reached before delimiter is found.
- pub fn eat_until(&mut self, mut predicate: impl FnMut(&char) -> bool) -> Option<String> {
- let mut token = String::new();
- while let Some(c) = self.eat_char() {
- match predicate(&c) {
- true => {
- self.end = self.prev;
- return Some(token);
- }
- false => token.push(c),
- }
+ pub fn track_until(&mut self, mut predicate: impl FnMut(&mut Self) -> bool) -> Option<String> {
+ let start = self.mark;
+ let mut end = self.mark;
+ while !predicate(self) {
+ self.peek_char()?;
+ end = self.mark;
}
- return None;
+ self.end = self.prev;
+ return Some(self.get_chars(&start, &end).iter().collect());
}
/// Returns true if the remainder of the line is whitespace.