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()
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
23
src/serde.rs
23
src/serde.rs
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue