algae_mmr/cmp/
payloads.rs

1/*
2    Appellation: rangemap <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4    Description: ... summary ...
5*/
6use 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}