Skip to content

Commit f0d41d8

Browse files
committed
primitives - BalancesMap - simplify and make it work with newtypes
1 parent bf916e2 commit f0d41d8

File tree

1 file changed

+48
-19
lines changed

1 file changed

+48
-19
lines changed

primitives/src/balances_map.rs

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
use std::collections::BTreeMap;
22

33
use crate::BigNum;
4+
use serde_hex::{SerHexSeq, StrictPfx};
45
use std::collections::btree_map::{Entry, Iter, Values};
56

6-
use serde::{ser::SerializeMap, Deserialize, Serialize, Serializer};
7+
use serde::{Deserialize, Serialize};
78
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+
}
821

9-
type BalancesKey = String;
1022
type BalancesValue = BigNum;
1123

24+
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
1225
#[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>);
1727

1828
impl BalancesMap {
1929
pub fn iter(&self) -> Iter<'_, BalancesKey, BalancesValue> {
@@ -37,24 +47,43 @@ impl BalancesMap {
3747
}
3848
}
3949

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 {
4252
// @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();
4457

4558
BalancesMap(btree_map)
4659
}
4760
}
4861

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);
5988
}
6089
}

0 commit comments

Comments
 (0)