Skip to content

Commit 3c19091

Browse files
committed
add NumberAny::from_bytes, tests
1 parent c465aad commit 3c19091

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

crates/jiter/src/number_decoder.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -137,18 +137,16 @@ impl TryFrom<&[u8]> for NumberAny {
137137
type Error = JsonError;
138138

139139
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
140-
let first = *value.first().ok_or_else(|| json_error!(InvalidNumber, 0))?;
141-
let (int_parse, index) = IntParse::parse(value, 0, first)?;
142-
let (number, index) = match int_parse {
143-
IntParse::Int(int) => (Self::Int(int), index),
144-
IntParse::Float => {
145-
let (f, index) = NumberFloat::decode(value, 0, first, false)?;
146-
(Self::Float(f), index)
147-
}
148-
_ => return json_err!(InvalidNumber, index),
149-
};
140+
Self::from_bytes(value, false)
141+
}
142+
}
143+
144+
impl NumberAny {
145+
pub fn from_bytes(data: &[u8], allow_inf_nan: bool) -> Result<Self, JsonError> {
146+
let first = *data.first().ok_or_else(|| json_error!(InvalidNumber, 0))?;
147+
let (number, index) = Self::decode(data, 0, first, allow_inf_nan)?;
150148

151-
if index == value.len() {
149+
if index == data.len() {
152150
Ok(number)
153151
} else {
154152
json_err!(InvalidNumber, index)

crates/jiter/tests/main.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,11 +1457,32 @@ fn test_number_any_try_from_bytes() {
14571457
let e = NumberAny::try_from(b"0123".as_ref()).unwrap_err();
14581458
assert_eq!(e.to_string(), "invalid number at index 1");
14591459

1460+
let e = NumberAny::try_from(b"NaN".as_ref()).unwrap_err();
1461+
assert_eq!(e.to_string(), "expected value at index 0");
1462+
14601463
let too_long = "9".repeat(4309);
14611464
let e = NumberAny::try_from(too_long.as_bytes()).unwrap_err();
14621465
assert_eq!(e.to_string(), "number out of range at index 4301");
14631466
}
14641467

1468+
#[test]
1469+
fn test_number_any_try_from_bytes_allow() {
1470+
let n = NumberAny::from_bytes(b"123", true).unwrap();
1471+
assert_eq!(n, NumberAny::Int(NumberInt::Int(123)));
1472+
1473+
let e = NumberAny::from_bytes(b"x23", true).unwrap_err();
1474+
assert_eq!(e.to_string(), "invalid number at index 0");
1475+
1476+
let n = NumberAny::from_bytes(b"NaN", true).unwrap();
1477+
assert_eq!(format!("{n:?}"), "Float(NaN)");
1478+
1479+
let n = NumberAny::from_bytes(b"Infinity", true).unwrap();
1480+
assert_eq!(format!("{n:?}"), "Float(inf)");
1481+
1482+
let e = NumberAny::from_bytes(b"NaN", false).unwrap_err();
1483+
assert_eq!(e.to_string(), "expected value at index 0");
1484+
}
1485+
14651486
#[test]
14661487
fn jiter_skip_whole_object() {
14671488
let mut jiter = Jiter::new(br#"{"x": 1}"#);

0 commit comments

Comments
 (0)