Skip to content

Commit ef4271d

Browse files
Copilotsjoerdsimons
andcommitted
Add whitespace trimming for quick-xml 0.38 compatibility
Co-authored-by: sjoerdsimons <[email protected]>
1 parent e5bd573 commit ef4271d

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

bmap-parser/src/bmap/xml.rs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,33 @@ use serde::Deserialize;
44
use std::str::FromStr;
55
use thiserror::Error;
66

7+
/// Custom deserializer that trims whitespace before parsing u64
8+
/// This is needed for compatibility with quick-xml 0.38 which changed
9+
/// how it handles whitespace in text content
10+
fn deserialize_trimmed_u64<'de, D>(deserializer: D) -> Result<u64, D::Error>
11+
where
12+
D: serde::Deserializer<'de>,
13+
{
14+
let s = String::deserialize(deserializer)?;
15+
s.trim().parse().map_err(serde::de::Error::custom)
16+
}
17+
18+
/// Custom deserializer that trims whitespace from strings
19+
/// This is needed for compatibility with quick-xml 0.38 which changed
20+
/// how it handles whitespace in text content
21+
fn deserialize_trimmed_string<'de, D>(deserializer: D) -> Result<String, D::Error>
22+
where
23+
D: serde::Deserializer<'de>,
24+
{
25+
let s = String::deserialize(deserializer)?;
26+
Ok(s.trim().to_string())
27+
}
28+
729
#[derive(Debug, Deserialize)]
830
struct Range {
931
#[serde(rename = "@chksum")]
1032
chksum: String,
11-
#[serde(rename = "$value")]
33+
#[serde(rename = "$value", deserialize_with = "deserialize_trimmed_string")]
1234
range: String,
1335
}
1436

@@ -23,17 +45,17 @@ struct BlockMap {
2345
struct Bmap {
2446
#[serde(rename = "@version")]
2547
version: String,
26-
#[serde(rename = "ImageSize")]
48+
#[serde(rename = "ImageSize", deserialize_with = "deserialize_trimmed_u64")]
2749
image_size: u64,
28-
#[serde(rename = "BlockSize")]
50+
#[serde(rename = "BlockSize", deserialize_with = "deserialize_trimmed_u64")]
2951
block_size: u64,
30-
#[serde(rename = "BlocksCount")]
52+
#[serde(rename = "BlocksCount", deserialize_with = "deserialize_trimmed_u64")]
3153
blocks_count: u64,
32-
#[serde(rename = "MappedBlocksCount")]
54+
#[serde(rename = "MappedBlocksCount", deserialize_with = "deserialize_trimmed_u64")]
3355
mapped_blocks_count: u64,
34-
#[serde(rename = "ChecksumType")]
56+
#[serde(rename = "ChecksumType", deserialize_with = "deserialize_trimmed_string")]
3557
checksum_type: String,
36-
#[serde(rename = "BmapFileChecksum")]
58+
#[serde(rename = "BmapFileChecksum", deserialize_with = "deserialize_trimmed_string")]
3759
bmap_file_checksum: String,
3860
#[serde(rename = "BlockMap")]
3961
block_map: BlockMap,

0 commit comments

Comments
 (0)