From 4fdbf6b44f8b1a6dd8d1798508b209452d7d2a24 Mon Sep 17 00:00:00 2001 From: Nimrod Gutman Date: Wed, 4 Feb 2026 12:09:12 +0200 Subject: [PATCH 1/2] fix: expose peek_token and reset state after skip --- src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 18ace98..f180365 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -122,7 +122,7 @@ impl AsyncJsonStreamReader { } /// Peek at the next JSON token without consuming it. - async fn peek_token(&mut self) -> Result, AsyncJsonStreamReaderError> { + pub async fn peek_token(&mut self) -> Result, AsyncJsonStreamReaderError> { let saved_position = self.position; let saved_depth = self.depth; let saved_state = self.state; @@ -706,7 +706,7 @@ impl AsyncJsonStreamReader { } } - async fn skip_value(&mut self) -> Result<(), AsyncJsonStreamReaderError> { + pub async fn skip_value(&mut self) -> Result<(), AsyncJsonStreamReaderError> { let value_start_depth = self.depth; let token = self.next_token() @@ -741,6 +741,7 @@ impl AsyncJsonStreamReader { }); } } + self.state = ReaderState::Object; Ok(()) } From e2b97b7065d79de31fe6803544e800370ce7a731 Mon Sep 17 00:00:00 2001 From: Nimrod Gutman Date: Wed, 4 Feb 2026 13:52:40 +0200 Subject: [PATCH 2/2] test: cover skip_value state reset --- src/lib.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index f180365..47fd040 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1082,6 +1082,35 @@ mod tests { assert!(reader.next_object_entry().await.unwrap().is_none()); } + #[tokio::test] + async fn test_skip_value_resets_state_for_next_entry() { + let mut reader = create_reader(r#"{"a": {"x": 1}, "b": 2}"#); + + let key = reader.next_object_entry().await.unwrap().unwrap(); + assert_eq!(key, "a"); + + // Explicitly skip the value for "a". + reader.skip_value().await.unwrap(); + + let key = reader.next_object_entry().await.unwrap().unwrap(); + assert_eq!(key, "b"); + assert_eq!(reader.read_number::().await.unwrap(), 2); + } + + #[tokio::test] + async fn test_peek_token_does_not_consume() { + let mut reader = create_reader(r#"{"a": 1}"#); + + assert_eq!( + reader.peek_token().await.unwrap(), + Some(JsonToken::StartObject) + ); + assert_eq!( + reader.next_token().await.unwrap(), + Some(JsonToken::StartObject) + ); + } + #[tokio::test] async fn test_skip_value_object() { let mut reader = create_reader(r#"{"name": {"first": "John", "last": "Doe"}, "age": 30}"#);