1
1
use std:: collections:: BTreeMap ;
2
2
3
3
use crate :: BigNum ;
4
+ use serde_hex:: { SerHexSeq , StrictPfx } ;
4
5
use std:: collections:: btree_map:: { Entry , Iter , Values } ;
5
6
6
- use serde:: { ser :: SerializeMap , Deserialize , Serialize , Serializer } ;
7
+ use serde:: { Deserialize , Serialize } ;
7
8
use std:: iter:: FromIterator ;
9
+ use std:: ops:: Deref ;
10
+
11
+ #[ derive( Debug , Clone , Serialize , Deserialize , PartialOrd , Ord , PartialEq , Eq ) ]
12
+ #[ serde( transparent) ]
13
+ pub struct BalancesKey ( #[ serde( with = "SerHexSeq::<StrictPfx>" ) ] Vec < u8 > ) ;
14
+ impl Deref for BalancesKey {
15
+ type Target = Vec < u8 > ;
16
+
17
+ fn deref ( & self ) -> & Self :: Target {
18
+ & self . 0
19
+ }
20
+ }
8
21
9
- type BalancesKey = String ;
10
22
type BalancesValue = BigNum ;
11
23
24
+ #[ derive( Clone , Debug , Default , Deserialize , Serialize , PartialEq , Eq ) ]
12
25
#[ serde( transparent) ]
13
- #[ derive( Clone , Debug , Deserialize , Default ) ]
14
- pub struct BalancesMap (
15
- #[ serde( serialize_with = "serialize_balances_map" ) ] BTreeMap < BalancesKey , BalancesValue > ,
16
- ) ;
26
+ pub struct BalancesMap ( BTreeMap < BalancesKey , BalancesValue > ) ;
17
27
18
28
impl BalancesMap {
19
29
pub fn iter ( & self ) -> Iter < ' _ , BalancesKey , BalancesValue > {
@@ -37,24 +47,43 @@ impl BalancesMap {
37
47
}
38
48
}
39
49
40
- impl FromIterator < ( BalancesKey , BalancesValue ) > for BalancesMap {
41
- fn from_iter < I : IntoIterator < Item = ( BalancesKey , BalancesValue ) > > ( iter : I ) -> Self {
50
+ impl < K : AsRef < [ u8 ] > > FromIterator < ( K , BalancesValue ) > for BalancesMap {
51
+ fn from_iter < I : IntoIterator < Item = ( K , BalancesValue ) > > ( iter : I ) -> Self {
42
52
// @TODO: Is there better way to do this?
43
- let btree_map: BTreeMap < BalancesKey , BalancesValue > = iter. into_iter ( ) . collect ( ) ;
53
+ let btree_map: BTreeMap < BalancesKey , BalancesValue > = iter
54
+ . into_iter ( )
55
+ . map ( |( k, v) | ( BalancesKey ( k. as_ref ( ) . to_vec ( ) ) , v) )
56
+ . collect ( ) ;
44
57
45
58
BalancesMap ( btree_map)
46
59
}
47
60
}
48
61
49
- impl Serialize for BalancesMap {
50
- fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
51
- where
52
- S : Serializer ,
53
- {
54
- let mut map = serializer. serialize_map ( Some ( self . 0 . len ( ) ) ) ?;
55
- for ( key, big_num) in self . 0 . iter ( ) {
56
- map. serialize_entry ( & key. to_lowercase ( ) , big_num) ?;
57
- }
58
- map. end ( )
62
+ #[ cfg( test) ]
63
+ mod test {
64
+ use super :: * ;
65
+ use crate :: BigNum ;
66
+
67
+ #[ test]
68
+ fn test_map ( ) {
69
+ let data = vec ! [
70
+ (
71
+ "0xce07CbB7e054514D590a0262C93070D838bFBA2e" . to_string( ) ,
72
+ BigNum :: from( 50_u64 ) ,
73
+ ) ,
74
+ (
75
+ "0x061d5e2a67d0a9a10f1c732bca12a676d83f79663a396f7d87b3e30b9b411088" . to_string( ) ,
76
+ BigNum :: from( 100_u64 ) ,
77
+ ) ,
78
+ ] ;
79
+
80
+ let balances_map: BalancesMap = data. into_iter ( ) . collect ( ) ;
81
+
82
+ let actual_json = serde_json:: to_string ( & balances_map) . expect ( "Should serialize it" ) ;
83
+
84
+ let balances_map_from_json: BalancesMap =
85
+ serde_json:: from_str ( & string) . expect ( "Should deserialize it" ) ;
86
+
87
+ assert_eq ! ( balances_map, balances_map_from_json) ;
59
88
}
60
89
}
0 commit comments