zinq_schema/value/
object.rs1use 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}