surrealdb/api/value/
obj.rs

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