Skip to content

Commit 88b33cd

Browse files
authored
fixed number parsing when &str contains whitespace (#102)
1 parent 951fe9c commit 88b33cd

File tree

2 files changed

+50
-4
lines changed

2 files changed

+50
-4
lines changed

instant-xml/src/impls.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,18 @@ macro_rules! from_xml_for_number {
193193
return Err(Error::DuplicateValue(field));
194194
}
195195

196-
let mut value = None;
197-
FromXmlStr::<Self>::deserialize(&mut value, field, deserializer)?;
198-
if let Some(value) = value {
199-
*into = Some(value.0);
196+
let Some(value) = deserializer.take_str()? else {
197+
return Ok(());
198+
};
199+
200+
match <$typ>::from_str(value.as_ref().trim()) {
201+
Ok(value) => *into = Some(value),
202+
Err(_) => {
203+
return Err(Error::UnexpectedValue(format!(
204+
"unable to parse number {} from `{value}` for {field}",
205+
type_name::<$typ>()
206+
)))
207+
}
200208
}
201209

202210
Ok(())

instant-xml/tests/number.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use instant_xml::{from_str, FromXml};
2+
use similar_asserts::assert_eq;
3+
4+
#[derive(FromXml, PartialEq, Debug)]
5+
struct Number {
6+
pub i_8: i8,
7+
pub i_16: i16,
8+
pub i_32: i32,
9+
pub i_64: i64,
10+
pub i_size: isize,
11+
pub u_8: u8,
12+
pub u_16: u16,
13+
pub u_32: u32,
14+
pub u_64: u64,
15+
pub u_size: usize,
16+
pub f_32: f32,
17+
pub f_64: f64,
18+
}
19+
20+
#[test]
21+
fn deserialize_spaced_numbers_fields() {
22+
let v = Number {
23+
i_8: -1,
24+
i_16: -32456,
25+
i_32: -6034568,
26+
i_64: -1245789630056,
27+
i_size: -125698389,
28+
u_8: 9,
29+
u_16: 64469,
30+
u_32: 6034568,
31+
u_64: 99245789630056,
32+
u_size: 125698389,
33+
f_32: -12.5683,
34+
f_64: 104568.568932,
35+
};
36+
let xml = r#"<Number><i_8> -1 </i_8><i_16>-32456 </i_16><i_32>-6034568 </i_32><i_64>-1245789630056 </i_64><i_size>-125698389 </i_size><u_8>9 </u_8><u_16>64469 </u_16><u_32>6034568 </u_32><u_64> 99245789630056 </u_64><u_size>125698389 </u_size><f_32> -12.5683 </f_32><f_64> 104568.568932 </f_64></Number>"#;
37+
assert_eq!(v, from_str(xml).unwrap());
38+
}

0 commit comments

Comments
 (0)