@@ -4,11 +4,23 @@ use serde::Deserialize;
44use std:: str:: FromStr ;
55use thiserror:: Error ;
66
7+ /// Custom deserializer to first trim whitespace around text elements before converting.
8+ /// Should be unnecessary once https://github.com/tafia/quick-xml/issues/900 gets fixed
9+ fn deserialize_trimmed < ' de , D , T > ( deserializer : D ) -> Result < T , D :: Error >
10+ where
11+ D : serde:: Deserializer < ' de > ,
12+ T : FromStr ,
13+ <T as std:: str:: FromStr >:: Err : std:: fmt:: Display ,
14+ {
15+ let s = <& str >:: deserialize ( deserializer) ?;
16+ s. trim ( ) . parse ( ) . map_err ( serde:: de:: Error :: custom)
17+ }
18+
719#[ derive( Debug , Deserialize ) ]
820struct Range {
921 #[ serde( rename = "@chksum" ) ]
1022 chksum : String ,
11- #[ serde( rename = "$value" ) ]
23+ #[ serde( rename = "$value" , deserialize_with = "deserialize_trimmed" ) ]
1224 range : String ,
1325}
1426
@@ -23,17 +35,17 @@ struct BlockMap {
2335struct Bmap {
2436 #[ serde( rename = "@version" ) ]
2537 version : String ,
26- #[ serde( rename = "ImageSize" ) ]
38+ #[ serde( rename = "ImageSize" , deserialize_with = "deserialize_trimmed" ) ]
2739 image_size : u64 ,
28- #[ serde( rename = "BlockSize" ) ]
40+ #[ serde( rename = "BlockSize" , deserialize_with = "deserialize_trimmed" ) ]
2941 block_size : u64 ,
30- #[ serde( rename = "BlocksCount" ) ]
42+ #[ serde( rename = "BlocksCount" , deserialize_with = "deserialize_trimmed" ) ]
3143 blocks_count : u64 ,
32- #[ serde( rename = "MappedBlocksCount" ) ]
44+ #[ serde( rename = "MappedBlocksCount" , deserialize_with = "deserialize_trimmed" ) ]
3345 mapped_blocks_count : u64 ,
34- #[ serde( rename = "ChecksumType" ) ]
46+ #[ serde( rename = "ChecksumType" , deserialize_with = "deserialize_trimmed" ) ]
3547 checksum_type : String ,
36- #[ serde( rename = "BmapFileChecksum" ) ]
48+ #[ serde( rename = "BmapFileChecksum" , deserialize_with = "deserialize_trimmed" ) ]
3749 bmap_file_checksum : String ,
3850 #[ serde( rename = "BlockMap" ) ]
3951 block_map : BlockMap ,
@@ -79,7 +91,7 @@ fn str_to_digest(s: String, digest: &mut [u8]) -> Result<(), XmlError> {
7991 Some ( v) => v,
8092 None => return Err ( XmlError :: InvalidChecksum ( s) ) ,
8193 } ;
82- digest[ i] = hi << 4 | lo;
94+ digest[ i] = ( hi << 4 ) | lo;
8395 }
8496
8597 Ok ( ( ) )
0 commit comments