surrealdb/api/value/
obj.rs1use std::borrow::Borrow;
2use std::collections::btree_map::{IntoIter as BIntoIter, Iter as BIter, IterMut as BIterMut};
3use std::iter::FusedIterator;
4
5use super::Value;
6use crate::core::val;
7
8transparent_wrapper! {
9 #[derive(Clone, Default, Eq, PartialEq, Ord, PartialOrd, Hash)]
10 pub struct Object(val::Object)
11}
12impl_serialize_wrapper!(Object);
13
14impl Object {
15 pub fn new() -> Self {
16 Object(val::Object::default())
17 }
18
19 pub fn clear(&mut self) {
20 self.0.clear()
21 }
22
23 pub fn get<Q>(&self, key: &Q) -> Option<&Value>
24 where
25 String: Borrow<Q>,
26 Q: Ord + ?Sized,
27 {
28 self.0.get(key).map(Value::from_inner_ref)
29 }
30
31 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut Value>
32 where
33 String: Borrow<Q>,
34 Q: Ord + ?Sized,
35 {
36 self.0.get_mut(key).map(Value::from_inner_mut)
37 }
38
39 pub fn contains_key<Q>(&self, key: &Q) -> bool
40 where
41 String: Borrow<Q>,
42 Q: ?Sized + Ord,
43 {
44 self.0.contains_key(key)
45 }
46
47 pub fn remove<Q>(&mut self, key: &Q) -> Option<Value>
48 where
49 String: Borrow<Q>,
50 Q: ?Sized + Ord,
51 {
52 self.0.remove(key).map(Value::from_inner)
53 }
54
55 pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)>
56 where
57 String: Borrow<Q>,
58 Q: ?Sized + Ord,
59 {
60 self.0.remove_entry(key).map(|(a, b)| (a, Value::from_inner(b)))
61 }
62
63 pub fn iter(&self) -> Iter<'_> {
64 Iter {
65 iter: self.0.iter(),
66 }
67 }
68
69 pub fn iter_mut(&mut self) -> IterMut<'_> {
70 IterMut {
71 iter: self.0.iter_mut(),
72 }
73 }
74
75 pub fn len(&self) -> usize {
76 self.0.len()
77 }
78
79 pub fn is_empty(&self) -> bool {
80 self.0.is_empty()
81 }
82
83 pub fn insert<V>(&mut self, key: String, value: V) -> Option<Value>
84 where
85 V: Into<Value>,
86 {
87 self.0.insert(key, value.into().into_inner()).map(Value::from_inner)
88 }
89}
90
91pub struct IntoIter {
92 iter: BIntoIter<String, val::Value>,
93}
94
95impl Iterator for IntoIter {
96 type Item = (String, Value);
97
98 fn next(&mut self) -> Option<Self::Item> {
99 self.iter.next().map(|x| (x.0, Value::from_inner(x.1)))
100 }
101
102 fn size_hint(&self) -> (usize, Option<usize>) {
103 self.iter.size_hint()
104 }
105}
106
107impl DoubleEndedIterator for IntoIter {
108 fn next_back(&mut self) -> Option<Self::Item> {
109 self.iter.next_back().map(|x| (x.0, Value::from_inner(x.1)))
110 }
111}
112
113impl ExactSizeIterator for IntoIter {
114 fn len(&self) -> usize {
115 self.iter.len()
116 }
117}
118
119impl FusedIterator for IntoIter {}
120
121impl IntoIterator for Object {
122 type Item = (String, Value);
123
124 type IntoIter = IntoIter;
125
126 fn into_iter(self) -> Self::IntoIter {
127 IntoIter {
128 iter: self.0.0.into_iter(),
129 }
130 }
131}
132
133#[derive(Clone)]
134pub struct Iter<'a> {
135 iter: BIter<'a, String, val::Value>,
136}
137
138impl<'a> IntoIterator for &'a Object {
139 type Item = (&'a String, &'a Value);
140
141 type IntoIter = Iter<'a>;
142
143 fn into_iter(self) -> Self::IntoIter {
144 self.iter()
145 }
146}
147
148impl<'a> Iterator for Iter<'a> {
149 type Item = (&'a String, &'a Value);
150
151 fn next(&mut self) -> Option<Self::Item> {
152 self.iter.next().map(|(a, b)| (a, Value::from_inner_ref(b)))
153 }
154
155 fn size_hint(&self) -> (usize, Option<usize>) {
156 self.iter.size_hint()
157 }
158
159 fn last(self) -> Option<Self::Item>
160 where
161 Self: Sized,
162 {
163 self.iter.last().map(|(a, b)| (a, Value::from_inner_ref(b)))
164 }
165
166 fn min(mut self) -> Option<Self::Item> {
167 self.iter.next().map(|(a, b)| (a, Value::from_inner_ref(b)))
168 }
169
170 fn max(mut self) -> Option<Self::Item> {
171 self.iter.next_back().map(|(a, b)| (a, Value::from_inner_ref(b)))
172 }
173}
174
175impl FusedIterator for Iter<'_> {}
176
177impl DoubleEndedIterator for Iter<'_> {
178 fn next_back(&mut self) -> Option<Self::Item> {
179 self.iter.next_back().map(|(a, b)| (a, Value::from_inner_ref(b)))
180 }
181}
182
183impl ExactSizeIterator for Iter<'_> {
184 fn len(&self) -> usize {
185 self.iter.len()
186 }
187}
188
189pub struct IterMut<'a> {
190 iter: BIterMut<'a, String, val::Value>,
191}
192
193impl<'a> IntoIterator for &'a mut Object {
194 type Item = (&'a String, &'a mut Value);
195
196 type IntoIter = IterMut<'a>;
197
198 fn into_iter(self) -> Self::IntoIter {
199 self.iter_mut()
200 }
201}
202
203impl<'a> Iterator for IterMut<'a> {
204 type Item = (&'a String, &'a mut Value);
205
206 fn next(&mut self) -> Option<Self::Item> {
207 self.iter.next().map(|(a, b)| (a, Value::from_inner_mut(b)))
208 }
209
210 fn size_hint(&self) -> (usize, Option<usize>) {
211 self.iter.size_hint()
212 }
213
214 fn last(self) -> Option<Self::Item>
215 where
216 Self: Sized,
217 {
218 self.iter.last().map(|(a, b)| (a, Value::from_inner_mut(b)))
219 }
220
221 fn min(mut self) -> Option<Self::Item> {
222 self.iter.next().map(|(a, b)| (a, Value::from_inner_mut(b)))
223 }
224
225 fn max(mut self) -> Option<Self::Item> {
226 self.iter.next_back().map(|(a, b)| (a, Value::from_inner_mut(b)))
227 }
228}
229
230impl FusedIterator for IterMut<'_> {}
231
232impl DoubleEndedIterator for IterMut<'_> {
233 fn next_back(&mut self) -> Option<Self::Item> {
234 self.iter.next_back().map(|(a, b)| (a, Value::from_inner_mut(b)))
235 }
236}
237
238impl ExactSizeIterator for IterMut<'_> {
239 fn len(&self) -> usize {
240 self.iter.len()
241 }
242}