Skip to main content

surrealdb/api/value/
obj.rs

1use 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}