aboutsummaryrefslogtreecommitdiff
path: root/src/tokens.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2018-05-09 16:48:58 -0500
committerGitHub <noreply@github.com>2018-05-09 16:48:58 -0500
commitcb49d599924f2c78a8ea1172cd21f05dc6fbfa93 (patch)
tree4506e53b64daa801a2b58c9fbba56343f623278c /src/tokens.rs
parent8a54e5e0b6808a3192ec342b60e36b4325c47f02 (diff)
parent0a5fe3fff9a11b9684eb41be302606de0770f22d (diff)
downloadmilf-rs-cb49d599924f2c78a8ea1172cd21f05dc6fbfa93.tar.gz
milf-rs-cb49d599924f2c78a8ea1172cd21f05dc6fbfa93.zip
Merge pull request #239 from udoprog/spans
Support spans when deserializing serde structures
Diffstat (limited to 'src/tokens.rs')
-rw-r--r--src/tokens.rs29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/tokens.rs b/src/tokens.rs
index 3f47f02..1b5a755 100644
--- a/src/tokens.rs
+++ b/src/tokens.rs
@@ -119,21 +119,34 @@ impl<'a> Tokenizer<'a> {
}
pub fn eat(&mut self, expected: Token<'a>) -> Result<bool, Error> {
- match self.peek()? {
- Some((_, ref found)) if expected == *found => {}
- Some(_) => return Ok(false),
- None => return Ok(false),
- }
+ self.eat_spanned(expected).map(|s| s.is_some())
+ }
+
+ /// Eat a value, returning it's span if it was consumed.
+ pub fn eat_spanned(&mut self, expected: Token<'a>) -> Result<Option<Span>, Error> {
+ let span = match self.peek()? {
+ Some((span, ref found)) if expected == *found => span,
+ Some(_) => return Ok(None),
+ None => return Ok(None),
+ };
+
drop(self.next());
- Ok(true)
+ Ok(Some(span))
}
pub fn expect(&mut self, expected: Token<'a>) -> Result<(), Error> {
+ // ignore span
+ let _ = self.expect_spanned(expected)?;
+ Ok(())
+ }
+
+ /// Expect the given token returning its span.
+ pub fn expect_spanned(&mut self, expected: Token<'a>) -> Result<Span, Error> {
let current = self.current();
match self.next()? {
- Some((_, found)) => {
+ Some((span, found)) => {
if expected == found {
- Ok(())
+ Ok(span)
} else {
Err(Error::Wanted {
at: current,