Skip to content

Commit 5572e9e

Browse files
authored
fix: do not panic on conversion from ast to serde value with invalid number value (#51)
1 parent 7e14826 commit 5572e9e

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

rust-toolchain.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
[toolchain]
2-
channel = "1.82.0"
2+
channel = "1.88.0"
33
components = ["clippy", "rustfmt"]

src/ast.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ impl<'a> From<Value<'a>> for serde_json::Value {
6868
}
6969
Value::BooleanLit(b) => serde_json::Value::Bool(b.value),
7070
Value::NullKeyword(_) => serde_json::Value::Null,
71-
Value::NumberLit(num) => {
72-
let number = serde_json::Number::from_str(num.value).expect("could not parse number");
73-
serde_json::Value::Number(number)
74-
}
71+
Value::NumberLit(num) => match serde_json::Number::from_str(num.value) {
72+
Ok(number) => serde_json::Value::Number(number),
73+
Err(_) => serde_json::Value::String(num.value.to_string()),
74+
},
7575
Value::Object(obj) => {
7676
let mut map = serde_json::map::Map::new();
7777
for prop in obj.properties {
@@ -633,4 +633,27 @@ mod test {
633633
})
634634
);
635635
}
636+
637+
#[cfg(feature = "serde")]
638+
#[test]
639+
fn handle_weird_data() {
640+
let ast = parse_to_ast(
641+
r#"{eyyyyyyy:6yy:6000e000615yyyk:6}"#,
642+
&Default::default(),
643+
&ParseOptions::default(),
644+
)
645+
.unwrap();
646+
let value = ast.value.unwrap();
647+
let serde_value: serde_json::Value = value.into();
648+
649+
assert_eq!(
650+
serde_value,
651+
// this output is fine because the input is bad
652+
serde_json::json!({
653+
"eyyyyyyy": 6,
654+
"yy": "6000e000615",
655+
"yyyk": 6
656+
})
657+
);
658+
}
636659
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![deny(clippy::print_stderr)]
22
#![deny(clippy::print_stdout)]
3+
#![allow(clippy::uninlined_format_args)]
34

45
pub mod ast;
56
pub mod common;

src/parse_to_ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ fn parse_value<'a>(context: &mut Context<'a>) -> Result<Option<Value<'a>>, Parse
257257
Token::String(value) => Ok(Some(Value::StringLit(create_string_lit(context, value)))),
258258
Token::Boolean(value) => Ok(Some(Value::BooleanLit(create_boolean_lit(context, value)))),
259259
Token::Number(value) => Ok(Some(Value::NumberLit(create_number_lit(context, value)))),
260-
Token::Null => return Ok(Some(Value::NullKeyword(create_null_keyword(context)))),
260+
Token::Null => Ok(Some(Value::NullKeyword(create_null_keyword(context)))),
261261
Token::CloseBracket => Err(context.create_error(ParseErrorKind::UnexpectedCloseBracket)),
262262
Token::CloseBrace => Err(context.create_error(ParseErrorKind::UnexpectedCloseBrace)),
263263
Token::Comma => Err(context.create_error(ParseErrorKind::UnexpectedComma)),

0 commit comments

Comments
 (0)