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