mirror of
https://codeberg.org/icewind/vdf-reader.git
synced 2026-06-03 18:14:07 +02:00
add spans to more errors
This commit is contained in:
parent
47e94e6703
commit
08974c9db9
2 changed files with 27 additions and 6 deletions
10
src/error.rs
10
src/error.rs
|
|
@ -460,3 +460,13 @@ impl serde::de::Error for VdfError {
|
|||
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))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
21
src/serde.rs
21
src/serde.rs
|
|
@ -1,5 +1,5 @@
|
|||
use crate::entry::ParseItem;
|
||||
use crate::error::{ExpectToken, NoValidTokenError, SerdeParseError};
|
||||
use crate::error::{ExpectToken, NoValidTokenError, ResultExt, SerdeParseError};
|
||||
use crate::tokenizer::{SpannedToken, Tokenizer};
|
||||
use crate::{Token, VdfError};
|
||||
use logos::Span;
|
||||
|
|
@ -46,6 +46,10 @@ impl<'de> Deserializer<'de> {
|
|||
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) {
|
||||
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 peek = self.peek().expect_token(VALUE_TOKEN, source)?;
|
||||
match peek.token {
|
||||
Token::Item | Token::QuotedItem | Token::Statement | Token::QuotedStatement => {
|
||||
self.deserialize_str(visitor)
|
||||
}
|
||||
Token::GroupStart => self.deserialize_map(visitor),
|
||||
Token::Item | Token::QuotedItem | Token::Statement | Token::QuotedStatement => self
|
||||
.deserialize_str(visitor)
|
||||
.ensure_span(peek.span, self.source()),
|
||||
Token::GroupStart => self
|
||||
.deserialize_map(visitor)
|
||||
.ensure_span(peek.span, self.source()),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
|
@ -485,7 +491,12 @@ impl<'de, 'a> MapAccess<'de> for TableWalker<'de, 'a> {
|
|||
where
|
||||
V: DeserializeSeed<'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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue