mf_model/
attrs.rs

1use std::ops::{Deref, DerefMut};
2use std::ops::{Index, IndexMut};
3use rpds::{HashTrieMapSync};
4use serde::{Deserialize, Serialize, Deserializer, Serializer};
5use serde_json::Value;
6/// 节点属性
7#[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
51// 实现 IndexMut trait 用于修改值
52impl 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}