@@ -4,11 +4,33 @@ use serde::Deserialize;
44use std:: str:: FromStr ;
55use 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 ) ]
830struct 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 {
2345struct 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