add spans to more errors

This commit is contained in:
Robin Appelman 2023-12-18 17:27:40 +01:00
commit 08974c9db9
2 changed files with 27 additions and 6 deletions

View file

@ -460,3 +460,13 @@ impl serde::de::Error for VdfError {
UnknownVariantError::new(variant, expected, 0..0, "").into() UnknownVariantError::new(variant, expected, 0..0, "").into()
} }
} }
pub(crate) trait ResultExt {
fn ensure_span(self, span: Span, source: &str) -> Self;
}
impl<T> ResultExt for Result<T, VdfError> {
fn ensure_span(self, span: Span, source: &str) -> Self {
self.map_err(|e| e.with_source_span_if_none(span, source))
}
}

View file

@ -1,5 +1,5 @@
use crate::entry::ParseItem; use crate::entry::ParseItem;
use crate::error::{ExpectToken, NoValidTokenError, SerdeParseError}; use crate::error::{ExpectToken, NoValidTokenError, ResultExt, SerdeParseError};
use crate::tokenizer::{SpannedToken, Tokenizer}; use crate::tokenizer::{SpannedToken, Tokenizer};
use crate::{Token, VdfError}; use crate::{Token, VdfError};
use logos::Span; use logos::Span;
@ -46,6 +46,10 @@ impl<'de> Deserializer<'de> {
self.peeked.clone() self.peeked.clone()
} }
fn peek_span(&mut self) -> Option<Span> {
self.peek().and_then(|r| r.ok()).map(|token| token.span)
}
pub fn push_peeked(&mut self, token: SpannedToken) { pub fn push_peeked(&mut self, token: SpannedToken) {
self.peeked = Some(Ok(token)) self.peeked = Some(Ok(token))
} }
@ -92,10 +96,12 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
let source = self.source(); let source = self.source();
let peek = self.peek().expect_token(VALUE_TOKEN, source)?; let peek = self.peek().expect_token(VALUE_TOKEN, source)?;
match peek.token { match peek.token {
Token::Item | Token::QuotedItem | Token::Statement | Token::QuotedStatement => { Token::Item | Token::QuotedItem | Token::Statement | Token::QuotedStatement => self
self.deserialize_str(visitor) .deserialize_str(visitor)
} .ensure_span(peek.span, self.source()),
Token::GroupStart => self.deserialize_map(visitor), Token::GroupStart => self
.deserialize_map(visitor)
.ensure_span(peek.span, self.source()),
_ => unreachable!(), _ => unreachable!(),
} }
} }
@ -485,7 +491,12 @@ impl<'de, 'a> MapAccess<'de> for TableWalker<'de, 'a> {
where where
V: DeserializeSeed<'de>, V: DeserializeSeed<'de>,
{ {
seed.deserialize(&mut *self.de) if let Some(span) = self.de.peek_span() {
seed.deserialize(&mut *self.de)
.ensure_span(span, self.source())
} else {
seed.deserialize(&mut *self.de)
}
} }
} }