Skip to main content

zinq_schema/value/
object.rs

1use std::{collections::BTreeMap, fmt};
2
3#[derive(Debug, Clone, PartialEq)]
4#[cfg_attr(
5    feature = "serde",
6    derive(serde::Serialize, serde::Deserialize),
7    serde(transparent)
8)]
9pub struct Object(BTreeMap<String, super::Value>);
10
11impl Object {
12    pub fn new() -> Self {
13        return Self(BTreeMap::new());
14    }
15
16    pub fn merge(a: &Self, b: &Self) -> Self {
17        let mut object = Self::new();
18
19        for (key, value) in a {
20            object.set(key, value.clone());
21        }
22
23        for (key, value) in b {
24            object.set(key, value.clone());
25        }
26
27        return object;
28    }
29
30    pub fn len(&self) -> usize {
31        return self.0.len();
32    }
33
34    pub fn get(&self, key: &str) -> Option<&super::Value> {
35        return self.0.get(key);
36    }
37
38    pub fn set(&mut self, key: &str, value: super::Value) {
39        self.0.insert(key.to_string(), value);
40    }
41
42    pub fn del(&mut self, key: &str) {
43        self.0.remove(key);
44    }
45}
46
47impl From<BTreeMap<String, super::Value>> for Object {
48    fn from(value: BTreeMap<String, super::Value>) -> Self {
49        return Self(value);
50    }
51}
52
53impl Into<BTreeMap<String, super::Value>> for Object {
54    fn into(self) -> BTreeMap<String, super::Value> {
55        return self.0;
56    }
57}
58
59impl fmt::Display for Object {
60    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61        write!(f, "{{")?;
62
63        for (i, (key, value)) in self.0.iter().enumerate() {
64            write!(f, "\"{}\": {}", key, value)?;
65
66            if i < self.0.len() - 1 {
67                write!(f, ",")?;
68            }
69        }
70
71        return write!(f, "}}");
72    }
73}
74
75impl IntoIterator for Object {
76    type IntoIter = std::collections::btree_map::IntoIter<String, super::Value>;
77    type Item = (String, super::Value);
78
79    fn into_iter(self) -> Self::IntoIter {
80        return self.0.into_iter();
81    }
82}
83
84impl<'a> IntoIterator for &'a Object {
85    type IntoIter = std::collections::btree_map::Iter<'a, String, super::Value>;
86    type Item = (&'a String, &'a super::Value);
87
88    fn into_iter(self) -> Self::IntoIter {
89        return self.0.iter();
90    }
91}