diff --git a/CHANGELOG.md b/CHANGELOG.md index 7653071b..ceefd7a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - MSRV is now `1.87.0`. ### Added +- Added `pub` `Deserializer::bytes_consumed()` to allow easier partial parsing. - Implement `defmt::Format` for `EscapedStr`, `EscapedStringFragment` and `StringUnescapeError`. - Implement `Default` for `EscapedStr` (returning an empty string). diff --git a/src/de/mod.rs b/src/de/mod.rs index 64d4eeda..f5405914 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -124,6 +124,11 @@ impl<'a, 's> Deserializer<'a, 's> { } } + /// Returns the amount of data consumed so far. + pub fn bytes_consumed(&self) -> usize { + self.index + } + fn eat_char(&mut self) { self.index += 1; } @@ -133,7 +138,7 @@ impl<'a, 's> Deserializer<'a, 's> { pub fn end(&mut self) -> Result { match self.parse_whitespace() { Some(_) => Err(Error::TrailingCharacters), - None => Ok(self.index), + None => Ok(self.bytes_consumed()), } } @@ -1486,4 +1491,27 @@ mod tests { )) ) } + + #[test] + fn partial_parsing() { + #[derive(Debug, Deserialize, PartialEq)] + struct Temperature { + temperature: i8, + } + + use serde::de::Deserialize; + + let mut de = crate::de::Deserializer::new(br#"{"temperature":20}{"temperature":25}"#, None); + assert_eq!( + Temperature::deserialize(&mut de), + Ok(Temperature { temperature: 20 }) + ); + assert_eq!(de.bytes_consumed(), 18); + assert_eq!( + Temperature::deserialize(&mut de), + Ok(Temperature { temperature: 25 }) + ); + assert_eq!(de.bytes_consumed(), 36); + assert_eq!(de.end(), Ok(36)); + } }