Skip to content

Commit 2344e76

Browse files
committed
Address some feedback
1 parent 5de540e commit 2344e76

File tree

6 files changed

+78
-101
lines changed

6 files changed

+78
-101
lines changed

picojson/src/parse_error.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ pub enum ParseError {
1717
ScratchBufferFull,
1818
/// The input buffer is full.
1919
InputBufferFull,
20-
/// A string slice was not valid UTF-8.
21-
InvalidUtf8(core::str::Utf8Error),
2220
/// A number string could not be parsed.
2321
InvalidNumber,
2422
/// The parser entered an unexpected internal state.
@@ -67,7 +65,7 @@ impl From<stream_buffer::StreamBufferError> for ParseError {
6765

6866
impl From<core::str::Utf8Error> for ParseError {
6967
fn from(err: core::str::Utf8Error) -> Self {
70-
ParseError::InvalidUtf8(err)
68+
ParseError::Utf8(err)
7169
}
7270
}
7371

@@ -87,7 +85,7 @@ impl core::fmt::Display for ParseError {
8785
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
8886
match self {
8987
ParseError::TokenizerError(e) => write!(f, "{e}"),
90-
ParseError::InvalidUtf8(e) => write!(f, "Invalid UTF-8: {e}"),
88+
ParseError::Utf8(e) => write!(f, "Invalid UTF-8: {e}"),
9189
_ => write!(f, "{self:?}"),
9290
}
9391
}
@@ -141,10 +139,10 @@ mod tests {
141139
Err(utf8_error) => {
142140
let parse_error: ParseError = utf8_error.into();
143141
match parse_error {
144-
ParseError::InvalidUtf8(_) => {
142+
ParseError::Utf8(_) => {
145143
// Expected - conversion works correctly
146144
}
147-
_ => panic!("Expected InvalidUtf8 error"),
145+
_ => panic!("Expected Utf8 error"),
148146
}
149147
}
150148
Ok(_) => panic!("Expected UTF-8 validation to fail"),

picojson/src/push_parser.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,11 @@ where
139139
}
140140
}
141141
}
142-
Err(_e) => {}
142+
Err(e) => return Err(e.into()),
143143
}
144144
}
145145
}
146-
Err(_e) => {}
146+
Err(e) => return Err(e.into()),
147147
}
148148
}
149149
_ => {}
@@ -175,14 +175,23 @@ where
175175
where
176176
H: for<'a, 'b> PushParserHandler<'a, 'b, E>,
177177
{
178-
// Handle any remaining content in the buffer
179-
if self.state == ParserState::ParsingNumber {
180-
let s = self.stream_buffer.get_unescaped_slice()?;
181-
let num = JsonNumber::from_slice(s)?;
182-
self.handler
183-
.handle_event(Event::Number(num))
184-
.map_err(PushParseError::Handler)?;
185-
self.stream_buffer.clear_unescaped();
178+
// Handle any remaining content in the buffer and check for incomplete parsing
179+
match self.state {
180+
ParserState::ParsingNumber => {
181+
let s = self.stream_buffer.get_unescaped_slice()?;
182+
let num = JsonNumber::from_slice(s)?;
183+
self.handler
184+
.handle_event(Event::Number(num))
185+
.map_err(PushParseError::Handler)?;
186+
self.stream_buffer.clear_unescaped();
187+
}
188+
ParserState::ParsingString => {
189+
return Err(PushParseError::Parse(ParseError::EndOfData));
190+
}
191+
ParserState::ParsingKey => {
192+
return Err(PushParseError::Parse(ParseError::EndOfData));
193+
}
194+
ParserState::Idle => {}
186195
}
187196

188197
// Check that the JSON document is complete (all containers closed)
@@ -528,11 +537,11 @@ where
528537
}
529538
}
530539
}
531-
Err(_e) => {}
540+
Err(e) => return Err(e.into()),
532541
}
533542
}
534543
}
535-
Err(_e) => {}
544+
Err(e) => return Err(e.into()),
536545
}
537546
}
538547
}
@@ -630,10 +639,10 @@ fn create_tokenizer_callback(
630639
event_storage: &mut [Option<(ujson::Event, usize)>; 2],
631640
position_offset: usize,
632641
) -> impl FnMut(ujson::Event, usize) + '_ {
633-
move |event, _pos| {
642+
move |event, pos| {
634643
for evt in event_storage.iter_mut() {
635644
if evt.is_none() {
636-
*evt = Some((event, position_offset));
645+
*evt = Some((event, position_offset + pos));
637646
return;
638647
}
639648
}

picojson/src/stream_parser.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,8 +756,7 @@ mod tests {
756756
#[cfg(feature = "float")]
757757
NumberResult::Float(f) => {
758758
// This is expected in float-enabled build
759-
#[allow(clippy::approx_constant)]
760-
assert!((f - 3.14).abs() < 0.01);
759+
assert!((f - core::f64::consts::PI).abs() < 0.01);
761760
}
762761
#[cfg(feature = "float-skip")]
763762
NumberResult::FloatSkipped => {

picojson/tests/json_checker_tests.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ mod json_checker_tests {
3939
// Test handler for PushParser conformance tests
4040
struct ConformanceTestHandler {
4141
event_count: usize,
42-
error: Option<String>,
4342
}
4443

4544
impl<'a, 'b> PushParserHandler<'a, 'b, String> for ConformanceTestHandler {
@@ -53,7 +52,6 @@ mod json_checker_tests {
5352
let mut buffer = [0u8; 2048]; // Larger buffer for pass1.json
5453
let handler = ConformanceTestHandler {
5554
event_count: 0,
56-
error: None,
5755
};
5856
let mut parser = PushParser::<_, DefaultConfig>::new(handler, &mut buffer);
5957

picojson/tests/push_parser.rs

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -582,41 +582,6 @@ mod tests {
582582
assert_eq!(parser.finish::<()>(), Ok(()));
583583
}
584584

585-
#[test]
586-
fn test_unicode_escapes_not_yet_implemented() {
587-
// Debug handler that captures strings and keys to test Unicode escape processing
588-
struct UnicodeEscapeTestHandler {
589-
events: Vec<std::string::String>,
590-
}
591-
592-
impl<'a, 'b> PushParserHandler<'a, 'b, ()> for UnicodeEscapeTestHandler {
593-
fn handle_event(&mut self, event: Event<'a, 'b>) -> Result<(), ()> {
594-
let event_desc = match event {
595-
Event::StartObject => "StartObject".to_string(),
596-
Event::EndObject => "EndObject".to_string(),
597-
Event::Key(k) => format!("Key({})", k.as_ref()),
598-
Event::String(s) => format!("String({})", s.as_ref()),
599-
Event::EndDocument => "EndDocument".to_string(),
600-
_ => "Other".to_string(),
601-
};
602-
self.events.push(event_desc);
603-
Ok(())
604-
}
605-
}
606-
607-
let mut buffer = [0u8; 256];
608-
let handler = UnicodeEscapeTestHandler { events: Vec::new() };
609-
let mut parser = PushParser::<_, DefaultConfig>::new(handler, &mut buffer);
610-
611-
// Test string with Unicode escape sequence (\u0041 should become 'A')
612-
parser.write(br#"{"key": "\u0041"}"#).unwrap();
613-
parser.finish::<()>().unwrap();
614-
let handler = parser.destroy();
615-
616-
println!("Unicode escape events: {:?}", handler.events);
617-
618-
// This test verifies that Unicode escapes are working
619-
}
620585

621586
#[test]
622587
fn test_numbers() {

picojson/tests/push_parser_stress_test.rs

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,30 @@ use picojson::{
99
DefaultConfig, Event, JsonNumber, NumberResult, PushParseError, PushParser, PushParserHandler,
1010
};
1111

12+
/// Owned event representation for comparison
13+
#[derive(Debug, Clone, PartialEq)]
14+
enum OwnedEvent {
15+
StartObject,
16+
EndObject,
17+
StartArray,
18+
EndArray,
19+
Key(String),
20+
String(String),
21+
Number(String),
22+
Bool(bool),
23+
Null,
24+
EndDocument,
25+
}
26+
1227
/// Handler that collects events for verification during stress testing
13-
struct StressTestHandler<'expected> {
14-
events: Vec<Event<'static, 'static>>,
15-
expected_events: &'expected [Event<'static, 'static>],
28+
struct StressTestHandler {
29+
events: Vec<OwnedEvent>,
30+
expected_events: Vec<OwnedEvent>,
1631
current_index: usize,
1732
}
1833

19-
impl<'expected> StressTestHandler<'expected> {
20-
fn new(expected_events: &'expected [Event<'static, 'static>]) -> Self {
34+
impl StressTestHandler {
35+
fn new(expected_events: Vec<OwnedEvent>) -> Self {
2136
Self {
2237
events: Vec::new(),
2338
expected_events,
@@ -40,7 +55,7 @@ impl<'expected> StressTestHandler<'expected> {
4055
.zip(self.expected_events.iter())
4156
.enumerate()
4257
{
43-
if !events_equal(actual, expected) {
58+
if actual != expected {
4459
return Err(format!(
4560
"Event {} mismatch: expected {:?}, got {:?}",
4661
i, expected, actual
@@ -52,30 +67,22 @@ impl<'expected> StressTestHandler<'expected> {
5267
}
5368
}
5469

55-
impl<'input, 'scratch, 'expected> PushParserHandler<'input, 'scratch, String>
56-
for StressTestHandler<'expected>
70+
impl<'input, 'scratch> PushParserHandler<'input, 'scratch, String>
71+
for StressTestHandler
5772
{
5873
fn handle_event(&mut self, event: Event<'input, 'scratch>) -> Result<(), String> {
5974
// Convert to owned event for storage
6075
let owned_event = match event {
61-
Event::StartObject => Event::StartObject,
62-
Event::EndObject => Event::EndObject,
63-
Event::StartArray => Event::StartArray,
64-
Event::EndArray => Event::EndArray,
65-
Event::Key(k) => Event::Key(picojson::String::Borrowed(k.as_ref().to_string().leak())),
66-
Event::String(s) => {
67-
Event::String(picojson::String::Borrowed(s.as_ref().to_string().leak()))
68-
}
69-
Event::Number(n) => Event::Number(JsonNumber::Borrowed {
70-
raw: n.as_str().to_string().leak(),
71-
parsed: n
72-
.as_int()
73-
.map(NumberResult::Integer)
74-
.unwrap_or(NumberResult::IntegerOverflow),
75-
}),
76-
Event::Bool(b) => Event::Bool(b),
77-
Event::Null => Event::Null,
78-
Event::EndDocument => Event::EndDocument,
76+
Event::StartObject => OwnedEvent::StartObject,
77+
Event::EndObject => OwnedEvent::EndObject,
78+
Event::StartArray => OwnedEvent::StartArray,
79+
Event::EndArray => OwnedEvent::EndArray,
80+
Event::Key(k) => OwnedEvent::Key(k.as_ref().to_string()),
81+
Event::String(s) => OwnedEvent::String(s.as_ref().to_string()),
82+
Event::Number(n) => OwnedEvent::Number(n.as_str().to_string()),
83+
Event::Bool(b) => OwnedEvent::Bool(b),
84+
Event::Null => OwnedEvent::Null,
85+
Event::EndDocument => OwnedEvent::EndDocument,
7986
};
8087

8188
self.events.push(owned_event);
@@ -84,20 +91,21 @@ impl<'input, 'scratch, 'expected> PushParserHandler<'input, 'scratch, String>
8491
}
8592
}
8693

87-
/// Compare events for equality, handling lifetime differences
88-
fn events_equal(a: &Event, b: &Event) -> bool {
89-
match (a, b) {
90-
(Event::StartObject, Event::StartObject) => true,
91-
(Event::EndObject, Event::EndObject) => true,
92-
(Event::StartArray, Event::StartArray) => true,
93-
(Event::EndArray, Event::EndArray) => true,
94-
(Event::Key(k1), Event::Key(k2)) => k1.as_ref() == k2.as_ref(),
95-
(Event::String(s1), Event::String(s2)) => s1.as_ref() == s2.as_ref(),
96-
(Event::Number(n1), Event::Number(n2)) => n1.as_str() == n2.as_str(),
97-
(Event::Bool(b1), Event::Bool(b2)) => b1 == b2,
98-
(Event::Null, Event::Null) => true,
99-
(Event::EndDocument, Event::EndDocument) => true,
100-
_ => false,
94+
impl OwnedEvent {
95+
/// Convert from Event to OwnedEvent
96+
fn from_event(event: &Event) -> Self {
97+
match event {
98+
Event::StartObject => OwnedEvent::StartObject,
99+
Event::EndObject => OwnedEvent::EndObject,
100+
Event::StartArray => OwnedEvent::StartArray,
101+
Event::EndArray => OwnedEvent::EndArray,
102+
Event::Key(k) => OwnedEvent::Key(k.as_ref().to_string()),
103+
Event::String(s) => OwnedEvent::String(s.as_ref().to_string()),
104+
Event::Number(n) => OwnedEvent::Number(n.as_str().to_string()),
105+
Event::Bool(b) => OwnedEvent::Bool(*b),
106+
Event::Null => OwnedEvent::Null,
107+
Event::EndDocument => OwnedEvent::EndDocument,
108+
}
101109
}
102110
}
103111

@@ -299,7 +307,7 @@ fn test_push_parsing_with_config(
299307
chunk_pattern: &[usize],
300308
) -> Result<(), String> {
301309
let mut buffer = vec![0u8; buffer_size];
302-
let handler = StressTestHandler::new(&scenario.expected_events);
310+
let handler = StressTestHandler::new(scenario.expected_events.iter().map(OwnedEvent::from_event).collect());
303311
let mut parser = PushParser::<_, DefaultConfig>::new(handler, &mut buffer);
304312

305313
let mut writer = ChunkedWriter::new(scenario.json, chunk_pattern);
@@ -539,7 +547,7 @@ fn test_push_parser_stress_document_validation() {
539547

540548
for &pattern in chunk_patterns {
541549
let mut buffer = vec![0u8; buffer_size];
542-
let handler = StressTestHandler::new(&[]);
550+
let handler = StressTestHandler::new(vec![]);
543551
let mut parser = PushParser::<_, DefaultConfig>::new(handler, &mut buffer);
544552
let mut writer = ChunkedWriter::new(json, pattern);
545553

0 commit comments

Comments
 (0)