algae_mmr/cmp/
payloads.rs1use decanter::prelude::{Hashable, H256};
7use serde::{Deserialize, Serialize};
8use std::collections::HashMap;
9
10#[derive(Clone, Debug, Default, Deserialize, Eq, Hashable, PartialEq, Serialize)]
11pub struct Payload<T = String>
12where
13 T: ToString,
14{
15 id: H256,
16 data: HashMap<H256, T>,
17}
18
19impl<T> Payload<T>
20where
21 T: ToString,
22{
23 pub fn new() -> Self {
24 Self {
25 id: H256::generate(),
26 data: HashMap::new(),
27 }
28 }
29 pub fn data(&self) -> &HashMap<H256, T> {
30 &self.data
31 }
32 pub fn set_id(mut self, id: H256) -> Self {
33 self.id = id;
34 self
35 }
36 pub fn with_capacity(capacity: usize) -> Self {
37 Self {
38 id: H256::generate(),
39 data: HashMap::with_capacity(capacity),
40 }
41 }
42}
43
44impl<T> From<HashMap<H256, T>> for Payload<T>
45where
46 T: ToString,
47{
48 fn from(data: HashMap<H256, T>) -> Self {
49 Self {
50 id: H256::generate(),
51 data,
52 }
53 }
54}
55
56impl<T> std::fmt::Display for Payload<T>
57where
58 T: ToString,
59{
60 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61 let data = self
62 .data
63 .iter()
64 .map(|(k, v)| (k.to_string(), v.to_string()))
65 .collect::<HashMap<String, String>>();
66 write!(f, "{}", serde_json::to_value(data).unwrap())
67 }
68}
69
70impl<T> Extend<T> for Payload<T>
71where
72 T: ToString,
73{
74 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
75 for v in iter {
76 self.data.insert(H256::generate(), v);
77 }
78 }
79}
80
81impl<T> Extend<(H256, T)> for Payload<T>
82where
83 T: ToString,
84{
85 fn extend<I: IntoIterator<Item = (H256, T)>>(&mut self, iter: I) {
86 for (k, v) in iter {
87 self.data.insert(k, v);
88 }
89 }
90}
91
92impl<T> std::ops::Index<H256> for Payload<T>
93where
94 T: ToString,
95{
96 type Output = T;
97
98 fn index(&self, index: H256) -> &Self::Output {
99 &self.data[&index]
100 }
101}
102
103impl<T> std::ops::IndexMut<H256> for Payload<T>
104where
105 T: ToString,
106{
107 fn index_mut(&mut self, index: H256) -> &mut Self::Output {
108 self.data.get_mut(&index).unwrap()
109 }
110}
111
112#[cfg(test)]
113mod tests {
114 use super::*;
115
116 #[test]
117 fn test_payload() {
118 let mut payload = Payload::new();
119 payload.extend(vec!["a", "b"]);
120 assert_eq!(payload.data().len(), 2);
121 }
122}