1use std::ops::{Deref, DerefMut};
2use std::ops::{Index, IndexMut};
3use rpds::{HashTrieMapSync};
4use serde::{Deserialize, Serialize, Deserializer, Serializer};
5use serde_json::Value;
6#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct Attrs {
9 pub attrs: HashTrieMapSync<String, Value>,
10}
11
12impl Serialize for Attrs {
13 fn serialize<S>(
14 &self,
15 serializer: S,
16 ) -> Result<S::Ok, S::Error>
17 where
18 S: Serializer,
19 {
20 self.attrs.serialize(serializer)
21 }
22}
23
24impl<'de> Deserialize<'de> for Attrs {
25 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26 where
27 D: Deserializer<'de>,
28 {
29 let map = HashTrieMapSync::<String, Value>::deserialize(deserializer)?;
30 Ok(Attrs { attrs: map })
31 }
32}
33
34impl Default for Attrs {
35 fn default() -> Self {
36 Self { attrs: HashTrieMapSync::new_sync() }
37 }
38}
39
40impl Index<&str> for Attrs {
41 type Output = Value;
42
43 fn index(
44 &self,
45 key: &str,
46 ) -> &Self::Output {
47 self.get_safe(key).expect("Key not found")
48 }
49}
50
51impl IndexMut<&str> for Attrs {
53 fn index_mut(
54 &mut self,
55 key: &str,
56 ) -> &mut Self::Output {
57 if !self.attrs.contains_key(key) {
58 self.attrs.insert_mut(key.to_string(), Value::Null);
59 }
60 self.attrs.get_mut(key).expect("Key not found")
61 }
62}
63
64impl Attrs {
65 pub fn from(new_values: HashTrieMapSync<String, Value>) -> Self {
66 Self { attrs: new_values }
67 }
68 pub fn get_value<T: serde::de::DeserializeOwned>(
69 &self,
70 key: &str,
71 ) -> Option<T> {
72 self.attrs.get(key).and_then(|v| serde_json::from_value(v.clone()).ok())
73 }
74 pub fn update(
75 &self,
76 new_values: HashTrieMapSync<String, Value>,
77 ) -> Self {
78 let mut attrs = self.attrs.clone();
79 for (key, value) in new_values.iter() {
80 attrs = attrs.insert(key.clone(), value.clone());
81 }
82 Attrs { attrs }
83 }
84 pub fn get_safe(
85 &self,
86 key: &str,
87 ) -> Option<&Value> {
88 self.attrs.get(key)
89 }
90}
91
92impl Deref for Attrs {
93 type Target = HashTrieMapSync<String, Value>;
94
95 fn deref(&self) -> &Self::Target {
96 &self.attrs
97 }
98}
99
100impl DerefMut for Attrs {
101 fn deref_mut(&mut self) -> &mut Self::Target {
102 &mut self.attrs
103 }
104}