1//! A map of String to serde_json::Value.
2//!
3//! By default the map is backed by a [`BTreeMap`]. Enable the `preserve_order`
4//! feature of serde_json to use [`IndexMap`] instead.
5//!
6//! [`BTreeMap`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html
7//! [`IndexMap`]: https://docs.rs/indexmap/*/indexmap/map/struct.IndexMap.html
8
9use crate::value::Value;
10use alloc::string::String;
11use core::borrow::Borrow;
12use core::fmt::{self, Debug};
13use core::hash::Hash;
14use core::iter::FusedIterator;
15#[cfg(feature = "preserve_order")]
16use core::mem;
17use core::ops;
18use serde::de;
19
20#[cfg(not(feature = "preserve_order"))]
21use alloc::collections::{btree_map, BTreeMap};
22#[cfg(feature = "preserve_order")]
23use indexmap::IndexMap;
24
25/// Represents a JSON key/value type.
26pub struct Map<K, V> {
27 map: MapImpl<K, V>,
28}
29
30#[cfg(not(feature = "preserve_order"))]
31type MapImpl<K, V> = BTreeMap<K, V>;
32#[cfg(feature = "preserve_order")]
33type MapImpl<K, V> = IndexMap<K, V>;
34
35impl Map<String, Value> {
36 /// Makes a new empty Map.
37 #[inline]
38 pub fn new() -> Self {
39 Map {
40 map: MapImpl::new(),
41 }
42 }
43
44 /// Makes a new empty Map with the given initial capacity.
45 #[inline]
46 pub fn with_capacity(capacity: usize) -> Self {
47 Map {
48 #[cfg(not(feature = "preserve_order"))]
49 map: {
50 // does not support with_capacity
51 let _ = capacity;
52 BTreeMap::new()
53 },
54 #[cfg(feature = "preserve_order")]
55 map: IndexMap::with_capacity(capacity),
56 }
57 }
58
59 /// Clears the map, removing all values.
60 #[inline]
61 pub fn clear(&mut self) {
62 self.map.clear();
63 }
64
65 /// Returns a reference to the value corresponding to the key.
66 ///
67 /// The key may be any borrowed form of the map's key type, but the ordering
68 /// on the borrowed form *must* match the ordering on the key type.
69 #[inline]
70 pub fn get<Q>(&self, key: &Q) -> Option<&Value>
71 where
72 String: Borrow<Q>,
73 Q: ?Sized + Ord + Eq + Hash,
74 {
75 self.map.get(key)
76 }
77
78 /// Returns true if the map contains a value for the specified key.
79 ///
80 /// The key may be any borrowed form of the map's key type, but the ordering
81 /// on the borrowed form *must* match the ordering on the key type.
82 #[inline]
83 pub fn contains_key<Q>(&self, key: &Q) -> bool
84 where
85 String: Borrow<Q>,
86 Q: ?Sized + Ord + Eq + Hash,
87 {
88 self.map.contains_key(key)
89 }
90
91 /// Returns a mutable reference to the value corresponding to the key.
92 ///
93 /// The key may be any borrowed form of the map's key type, but the ordering
94 /// on the borrowed form *must* match the ordering on the key type.
95 #[inline]
96 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut Value>
97 where
98 String: Borrow<Q>,
99 Q: ?Sized + Ord + Eq + Hash,
100 {
101 self.map.get_mut(key)
102 }
103
104 /// Returns the key-value pair matching the given key.
105 ///
106 /// The key may be any borrowed form of the map's key type, but the ordering
107 /// on the borrowed form *must* match the ordering on the key type.
108 #[inline]
109 pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&String, &Value)>
110 where
111 String: Borrow<Q>,
112 Q: ?Sized + Ord + Eq + Hash,
113 {
114 self.map.get_key_value(key)
115 }
116
117 /// Inserts a key-value pair into the map.
118 ///
119 /// If the map did not have this key present, `None` is returned.
120 ///
121 /// If the map did have this key present, the value is updated, and the old
122 /// value is returned.
123 #[inline]
124 pub fn insert(&mut self, k: String, v: Value) -> Option<Value> {
125 self.map.insert(k, v)
126 }
127
128 /// Removes a key from the map, returning the value at the key if the key
129 /// was previously in the map.
130 ///
131 /// The key may be any borrowed form of the map's key type, but the ordering
132 /// on the borrowed form *must* match the ordering on the key type.
133 ///
134 /// If serde_json's "preserve_order" is enabled, `.remove(key)` is
135 /// equivalent to [`.swap_remove(key)`][Self::swap_remove], replacing this
136 /// entry's position with the last element. If you need to preserve the
137 /// relative order of the keys in the map, use
138 /// [`.shift_remove(key)`][Self::shift_remove] instead.
139 #[inline]
140 pub fn remove<Q>(&mut self, key: &Q) -> Option<Value>
141 where
142 String: Borrow<Q>,
143 Q: ?Sized + Ord + Eq + Hash,
144 {
145 #[cfg(feature = "preserve_order")]
146 return self.swap_remove(key);
147 #[cfg(not(feature = "preserve_order"))]
148 return self.map.remove(key);
149 }
150
151 /// Removes a key from the map, returning the stored key and value if the
152 /// key was previously in the map.
153 ///
154 /// The key may be any borrowed form of the map's key type, but the ordering
155 /// on the borrowed form *must* match the ordering on the key type.
156 ///
157 /// If serde_json's "preserve_order" is enabled, `.remove_entry(key)` is
158 /// equivalent to [`.swap_remove_entry(key)`][Self::swap_remove_entry],
159 /// replacing this entry's position with the last element. If you need to
160 /// preserve the relative order of the keys in the map, use
161 /// [`.shift_remove_entry(key)`][Self::shift_remove_entry] instead.
162 #[inline]
163 pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)>
164 where
165 String: Borrow<Q>,
166 Q: ?Sized + Ord + Eq + Hash,
167 {
168 #[cfg(feature = "preserve_order")]
169 return self.swap_remove_entry(key);
170 #[cfg(not(feature = "preserve_order"))]
171 return self.map.remove_entry(key);
172 }
173
174 /// Removes and returns the value corresponding to the key from the map.
175 ///
176 /// Like [`Vec::swap_remove`], the entry is removed by swapping it with the
177 /// last element of the map and popping it off. This perturbs the position
178 /// of what used to be the last element!
179 ///
180 /// [`Vec::swap_remove`]: std::vec::Vec::swap_remove
181 #[cfg(feature = "preserve_order")]
182 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
183 #[inline]
184 pub fn swap_remove<Q>(&mut self, key: &Q) -> Option<Value>
185 where
186 String: Borrow<Q>,
187 Q: ?Sized + Ord + Eq + Hash,
188 {
189 self.map.swap_remove(key)
190 }
191
192 /// Remove and return the key-value pair.
193 ///
194 /// Like [`Vec::swap_remove`], the entry is removed by swapping it with the
195 /// last element of the map and popping it off. This perturbs the position
196 /// of what used to be the last element!
197 ///
198 /// [`Vec::swap_remove`]: std::vec::Vec::swap_remove
199 #[cfg(feature = "preserve_order")]
200 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
201 #[inline]
202 pub fn swap_remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)>
203 where
204 String: Borrow<Q>,
205 Q: ?Sized + Ord + Eq + Hash,
206 {
207 self.map.swap_remove_entry(key)
208 }
209
210 /// Removes and returns the value corresponding to the key from the map.
211 ///
212 /// Like [`Vec::remove`], the entry is removed by shifting all of the
213 /// elements that follow it, preserving their relative order. This perturbs
214 /// the index of all of those elements!
215 ///
216 /// [`Vec::remove`]: std::vec::Vec::remove
217 #[cfg(feature = "preserve_order")]
218 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
219 #[inline]
220 pub fn shift_remove<Q>(&mut self, key: &Q) -> Option<Value>
221 where
222 String: Borrow<Q>,
223 Q: ?Sized + Ord + Eq + Hash,
224 {
225 self.map.shift_remove(key)
226 }
227
228 /// Remove and return the key-value pair.
229 ///
230 /// Like [`Vec::remove`], the entry is removed by shifting all of the
231 /// elements that follow it, preserving their relative order. This perturbs
232 /// the index of all of those elements!
233 ///
234 /// [`Vec::remove`]: std::vec::Vec::remove
235 #[cfg(feature = "preserve_order")]
236 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
237 #[inline]
238 pub fn shift_remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)>
239 where
240 String: Borrow<Q>,
241 Q: ?Sized + Ord + Eq + Hash,
242 {
243 self.map.shift_remove_entry(key)
244 }
245
246 /// Moves all elements from other into self, leaving other empty.
247 #[inline]
248 pub fn append(&mut self, other: &mut Self) {
249 #[cfg(feature = "preserve_order")]
250 self.map
251 .extend(mem::replace(&mut other.map, MapImpl::default()));
252 #[cfg(not(feature = "preserve_order"))]
253 self.map.append(&mut other.map);
254 }
255
256 /// Gets the given key's corresponding entry in the map for in-place
257 /// manipulation.
258 pub fn entry<S>(&mut self, key: S) -> Entry
259 where
260 S: Into<String>,
261 {
262 #[cfg(not(feature = "preserve_order"))]
263 use alloc::collections::btree_map::Entry as EntryImpl;
264 #[cfg(feature = "preserve_order")]
265 use indexmap::map::Entry as EntryImpl;
266
267 match self.map.entry(key.into()) {
268 EntryImpl::Vacant(vacant) => Entry::Vacant(VacantEntry { vacant }),
269 EntryImpl::Occupied(occupied) => Entry::Occupied(OccupiedEntry { occupied }),
270 }
271 }
272
273 /// Returns the number of elements in the map.
274 #[inline]
275 pub fn len(&self) -> usize {
276 self.map.len()
277 }
278
279 /// Returns true if the map contains no elements.
280 #[inline]
281 pub fn is_empty(&self) -> bool {
282 self.map.is_empty()
283 }
284
285 /// Gets an iterator over the entries of the map.
286 #[inline]
287 pub fn iter(&self) -> Iter {
288 Iter {
289 iter: self.map.iter(),
290 }
291 }
292
293 /// Gets a mutable iterator over the entries of the map.
294 #[inline]
295 pub fn iter_mut(&mut self) -> IterMut {
296 IterMut {
297 iter: self.map.iter_mut(),
298 }
299 }
300
301 /// Gets an iterator over the keys of the map.
302 #[inline]
303 pub fn keys(&self) -> Keys {
304 Keys {
305 iter: self.map.keys(),
306 }
307 }
308
309 /// Gets an iterator over the values of the map.
310 #[inline]
311 pub fn values(&self) -> Values {
312 Values {
313 iter: self.map.values(),
314 }
315 }
316
317 /// Gets an iterator over mutable values of the map.
318 #[inline]
319 pub fn values_mut(&mut self) -> ValuesMut {
320 ValuesMut {
321 iter: self.map.values_mut(),
322 }
323 }
324
325 /// Retains only the elements specified by the predicate.
326 ///
327 /// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)`
328 /// returns `false`.
329 #[inline]
330 pub fn retain<F>(&mut self, f: F)
331 where
332 F: FnMut(&String, &mut Value) -> bool,
333 {
334 self.map.retain(f);
335 }
336}
337
338#[allow(clippy::derivable_impls)] // clippy bug: https://github.com/rust-lang/rust-clippy/issues/7655
339impl Default for Map<String, Value> {
340 #[inline]
341 fn default() -> Self {
342 Map {
343 map: MapImpl::new(),
344 }
345 }
346}
347
348impl Clone for Map<String, Value> {
349 #[inline]
350 fn clone(&self) -> Self {
351 Map {
352 map: self.map.clone(),
353 }
354 }
355
356 #[inline]
357 fn clone_from(&mut self, source: &Self) {
358 self.map.clone_from(&source.map);
359 }
360}
361
362impl PartialEq for Map<String, Value> {
363 #[inline]
364 fn eq(&self, other: &Self) -> bool {
365 self.map.eq(&other.map)
366 }
367}
368
369impl Eq for Map<String, Value> {}
370
371/// Access an element of this map. Panics if the given key is not present in the
372/// map.
373///
374/// ```
375/// # use serde_json::Value;
376/// #
377/// # let val = &Value::String("".to_owned());
378/// # let _ =
379/// match val {
380/// Value::String(s) => Some(s.as_str()),
381/// Value::Array(arr) => arr[0].as_str(),
382/// Value::Object(map) => map["type"].as_str(),
383/// _ => None,
384/// }
385/// # ;
386/// ```
387impl<'a, Q> ops::Index<&'a Q> for Map<String, Value>
388where
389 String: Borrow<Q>,
390 Q: ?Sized + Ord + Eq + Hash,
391{
392 type Output = Value;
393
394 fn index(&self, index: &Q) -> &Value {
395 self.map.index(index)
396 }
397}
398
399/// Mutably access an element of this map. Panics if the given key is not
400/// present in the map.
401///
402/// ```
403/// # use serde_json::json;
404/// #
405/// # let mut map = serde_json::Map::new();
406/// # map.insert("key".to_owned(), serde_json::Value::Null);
407/// #
408/// map["key"] = json!("value");
409/// ```
410impl<'a, Q> ops::IndexMut<&'a Q> for Map<String, Value>
411where
412 String: Borrow<Q>,
413 Q: ?Sized + Ord + Eq + Hash,
414{
415 fn index_mut(&mut self, index: &Q) -> &mut Value {
416 self.map.get_mut(index).expect(msg:"no entry found for key")
417 }
418}
419
420impl Debug for Map<String, Value> {
421 #[inline]
422 fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
423 self.map.fmt(formatter)
424 }
425}
426
427#[cfg(any(feature = "std", feature = "alloc"))]
428impl serde::ser::Serialize for Map<String, Value> {
429 #[inline]
430 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
431 where
432 S: serde::ser::Serializer,
433 {
434 use serde::ser::SerializeMap;
435 let mut map: ::SerializeMap = tri!(serializer.serialize_map(Some(self.len())));
436 for (k: &String, v: &Value) in self {
437 tri!(map.serialize_entry(k, v));
438 }
439 map.end()
440 }
441}
442
443impl<'de> de::Deserialize<'de> for Map<String, Value> {
444 #[inline]
445 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
446 where
447 D: de::Deserializer<'de>,
448 {
449 struct Visitor;
450
451 impl<'de> de::Visitor<'de> for Visitor {
452 type Value = Map<String, Value>;
453
454 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
455 formatter.write_str("a map")
456 }
457
458 #[inline]
459 fn visit_unit<E>(self) -> Result<Self::Value, E>
460 where
461 E: de::Error,
462 {
463 Ok(Map::new())
464 }
465
466 #[cfg(any(feature = "std", feature = "alloc"))]
467 #[inline]
468 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
469 where
470 V: de::MapAccess<'de>,
471 {
472 let mut values = Map::new();
473
474 while let Some((key, value)) = tri!(visitor.next_entry()) {
475 values.insert(key, value);
476 }
477
478 Ok(values)
479 }
480 }
481
482 deserializer.deserialize_map(Visitor)
483 }
484}
485
486impl FromIterator<(String, Value)> for Map<String, Value> {
487 fn from_iter<T>(iter: T) -> Self
488 where
489 T: IntoIterator<Item = (String, Value)>,
490 {
491 Map {
492 map: FromIterator::from_iter(iter),
493 }
494 }
495}
496
497impl Extend<(String, Value)> for Map<String, Value> {
498 fn extend<T>(&mut self, iter: T)
499 where
500 T: IntoIterator<Item = (String, Value)>,
501 {
502 self.map.extend(iter);
503 }
504}
505
506macro_rules! delegate_iterator {
507 (($name:ident $($generics:tt)*) => $item:ty) => {
508 impl $($generics)* Iterator for $name $($generics)* {
509 type Item = $item;
510 #[inline]
511 fn next(&mut self) -> Option<Self::Item> {
512 self.iter.next()
513 }
514 #[inline]
515 fn size_hint(&self) -> (usize, Option<usize>) {
516 self.iter.size_hint()
517 }
518 }
519
520 impl $($generics)* DoubleEndedIterator for $name $($generics)* {
521 #[inline]
522 fn next_back(&mut self) -> Option<Self::Item> {
523 self.iter.next_back()
524 }
525 }
526
527 impl $($generics)* ExactSizeIterator for $name $($generics)* {
528 #[inline]
529 fn len(&self) -> usize {
530 self.iter.len()
531 }
532 }
533
534 impl $($generics)* FusedIterator for $name $($generics)* {}
535 }
536}
537
538//////////////////////////////////////////////////////////////////////////////
539
540/// A view into a single entry in a map, which may either be vacant or occupied.
541/// This enum is constructed from the [`entry`] method on [`Map`].
542///
543/// [`entry`]: struct.Map.html#method.entry
544/// [`Map`]: struct.Map.html
545pub enum Entry<'a> {
546 /// A vacant Entry.
547 Vacant(VacantEntry<'a>),
548 /// An occupied Entry.
549 Occupied(OccupiedEntry<'a>),
550}
551
552/// A vacant Entry. It is part of the [`Entry`] enum.
553///
554/// [`Entry`]: enum.Entry.html
555pub struct VacantEntry<'a> {
556 vacant: VacantEntryImpl<'a>,
557}
558
559/// An occupied Entry. It is part of the [`Entry`] enum.
560///
561/// [`Entry`]: enum.Entry.html
562pub struct OccupiedEntry<'a> {
563 occupied: OccupiedEntryImpl<'a>,
564}
565
566#[cfg(not(feature = "preserve_order"))]
567type VacantEntryImpl<'a> = btree_map::VacantEntry<'a, String, Value>;
568#[cfg(feature = "preserve_order")]
569type VacantEntryImpl<'a> = indexmap::map::VacantEntry<'a, String, Value>;
570
571#[cfg(not(feature = "preserve_order"))]
572type OccupiedEntryImpl<'a> = btree_map::OccupiedEntry<'a, String, Value>;
573#[cfg(feature = "preserve_order")]
574type OccupiedEntryImpl<'a> = indexmap::map::OccupiedEntry<'a, String, Value>;
575
576impl<'a> Entry<'a> {
577 /// Returns a reference to this entry's key.
578 ///
579 /// # Examples
580 ///
581 /// ```
582 /// let mut map = serde_json::Map::new();
583 /// assert_eq!(map.entry("serde").key(), &"serde");
584 /// ```
585 pub fn key(&self) -> &String {
586 match self {
587 Entry::Vacant(e) => e.key(),
588 Entry::Occupied(e) => e.key(),
589 }
590 }
591
592 /// Ensures a value is in the entry by inserting the default if empty, and
593 /// returns a mutable reference to the value in the entry.
594 ///
595 /// # Examples
596 ///
597 /// ```
598 /// # use serde_json::json;
599 /// #
600 /// let mut map = serde_json::Map::new();
601 /// map.entry("serde").or_insert(json!(12));
602 ///
603 /// assert_eq!(map["serde"], 12);
604 /// ```
605 pub fn or_insert(self, default: Value) -> &'a mut Value {
606 match self {
607 Entry::Vacant(entry) => entry.insert(default),
608 Entry::Occupied(entry) => entry.into_mut(),
609 }
610 }
611
612 /// Ensures a value is in the entry by inserting the result of the default
613 /// function if empty, and returns a mutable reference to the value in the
614 /// entry.
615 ///
616 /// # Examples
617 ///
618 /// ```
619 /// # use serde_json::json;
620 /// #
621 /// let mut map = serde_json::Map::new();
622 /// map.entry("serde").or_insert_with(|| json!("hoho"));
623 ///
624 /// assert_eq!(map["serde"], "hoho".to_owned());
625 /// ```
626 pub fn or_insert_with<F>(self, default: F) -> &'a mut Value
627 where
628 F: FnOnce() -> Value,
629 {
630 match self {
631 Entry::Vacant(entry) => entry.insert(default()),
632 Entry::Occupied(entry) => entry.into_mut(),
633 }
634 }
635
636 /// Provides in-place mutable access to an occupied entry before any
637 /// potential inserts into the map.
638 ///
639 /// # Examples
640 ///
641 /// ```
642 /// # use serde_json::json;
643 /// #
644 /// let mut map = serde_json::Map::new();
645 /// map.entry("serde")
646 /// .and_modify(|e| *e = json!("rust"))
647 /// .or_insert(json!("cpp"));
648 ///
649 /// assert_eq!(map["serde"], "cpp");
650 ///
651 /// map.entry("serde")
652 /// .and_modify(|e| *e = json!("rust"))
653 /// .or_insert(json!("cpp"));
654 ///
655 /// assert_eq!(map["serde"], "rust");
656 /// ```
657 pub fn and_modify<F>(self, f: F) -> Self
658 where
659 F: FnOnce(&mut Value),
660 {
661 match self {
662 Entry::Occupied(mut entry) => {
663 f(entry.get_mut());
664 Entry::Occupied(entry)
665 }
666 Entry::Vacant(entry) => Entry::Vacant(entry),
667 }
668 }
669}
670
671impl<'a> VacantEntry<'a> {
672 /// Gets a reference to the key that would be used when inserting a value
673 /// through the VacantEntry.
674 ///
675 /// # Examples
676 ///
677 /// ```
678 /// use serde_json::map::Entry;
679 ///
680 /// let mut map = serde_json::Map::new();
681 ///
682 /// match map.entry("serde") {
683 /// Entry::Vacant(vacant) => {
684 /// assert_eq!(vacant.key(), &"serde");
685 /// }
686 /// Entry::Occupied(_) => unimplemented!(),
687 /// }
688 /// ```
689 #[inline]
690 pub fn key(&self) -> &String {
691 self.vacant.key()
692 }
693
694 /// Sets the value of the entry with the VacantEntry's key, and returns a
695 /// mutable reference to it.
696 ///
697 /// # Examples
698 ///
699 /// ```
700 /// # use serde_json::json;
701 /// #
702 /// use serde_json::map::Entry;
703 ///
704 /// let mut map = serde_json::Map::new();
705 ///
706 /// match map.entry("serde") {
707 /// Entry::Vacant(vacant) => {
708 /// vacant.insert(json!("hoho"));
709 /// }
710 /// Entry::Occupied(_) => unimplemented!(),
711 /// }
712 /// ```
713 #[inline]
714 pub fn insert(self, value: Value) -> &'a mut Value {
715 self.vacant.insert(value)
716 }
717}
718
719impl<'a> OccupiedEntry<'a> {
720 /// Gets a reference to the key in the entry.
721 ///
722 /// # Examples
723 ///
724 /// ```
725 /// # use serde_json::json;
726 /// #
727 /// use serde_json::map::Entry;
728 ///
729 /// let mut map = serde_json::Map::new();
730 /// map.insert("serde".to_owned(), json!(12));
731 ///
732 /// match map.entry("serde") {
733 /// Entry::Occupied(occupied) => {
734 /// assert_eq!(occupied.key(), &"serde");
735 /// }
736 /// Entry::Vacant(_) => unimplemented!(),
737 /// }
738 /// ```
739 #[inline]
740 pub fn key(&self) -> &String {
741 self.occupied.key()
742 }
743
744 /// Gets a reference to the value in the entry.
745 ///
746 /// # Examples
747 ///
748 /// ```
749 /// # use serde_json::json;
750 /// #
751 /// use serde_json::map::Entry;
752 ///
753 /// let mut map = serde_json::Map::new();
754 /// map.insert("serde".to_owned(), json!(12));
755 ///
756 /// match map.entry("serde") {
757 /// Entry::Occupied(occupied) => {
758 /// assert_eq!(occupied.get(), 12);
759 /// }
760 /// Entry::Vacant(_) => unimplemented!(),
761 /// }
762 /// ```
763 #[inline]
764 pub fn get(&self) -> &Value {
765 self.occupied.get()
766 }
767
768 /// Gets a mutable reference to the value in the entry.
769 ///
770 /// # Examples
771 ///
772 /// ```
773 /// # use serde_json::json;
774 /// #
775 /// use serde_json::map::Entry;
776 ///
777 /// let mut map = serde_json::Map::new();
778 /// map.insert("serde".to_owned(), json!([1, 2, 3]));
779 ///
780 /// match map.entry("serde") {
781 /// Entry::Occupied(mut occupied) => {
782 /// occupied.get_mut().as_array_mut().unwrap().push(json!(4));
783 /// }
784 /// Entry::Vacant(_) => unimplemented!(),
785 /// }
786 ///
787 /// assert_eq!(map["serde"].as_array().unwrap().len(), 4);
788 /// ```
789 #[inline]
790 pub fn get_mut(&mut self) -> &mut Value {
791 self.occupied.get_mut()
792 }
793
794 /// Converts the entry into a mutable reference to its value.
795 ///
796 /// # Examples
797 ///
798 /// ```
799 /// # use serde_json::json;
800 /// #
801 /// use serde_json::map::Entry;
802 ///
803 /// let mut map = serde_json::Map::new();
804 /// map.insert("serde".to_owned(), json!([1, 2, 3]));
805 ///
806 /// match map.entry("serde") {
807 /// Entry::Occupied(mut occupied) => {
808 /// occupied.into_mut().as_array_mut().unwrap().push(json!(4));
809 /// }
810 /// Entry::Vacant(_) => unimplemented!(),
811 /// }
812 ///
813 /// assert_eq!(map["serde"].as_array().unwrap().len(), 4);
814 /// ```
815 #[inline]
816 pub fn into_mut(self) -> &'a mut Value {
817 self.occupied.into_mut()
818 }
819
820 /// Sets the value of the entry with the `OccupiedEntry`'s key, and returns
821 /// the entry's old value.
822 ///
823 /// # Examples
824 ///
825 /// ```
826 /// # use serde_json::json;
827 /// #
828 /// use serde_json::map::Entry;
829 ///
830 /// let mut map = serde_json::Map::new();
831 /// map.insert("serde".to_owned(), json!(12));
832 ///
833 /// match map.entry("serde") {
834 /// Entry::Occupied(mut occupied) => {
835 /// assert_eq!(occupied.insert(json!(13)), 12);
836 /// assert_eq!(occupied.get(), 13);
837 /// }
838 /// Entry::Vacant(_) => unimplemented!(),
839 /// }
840 /// ```
841 #[inline]
842 pub fn insert(&mut self, value: Value) -> Value {
843 self.occupied.insert(value)
844 }
845
846 /// Takes the value of the entry out of the map, and returns it.
847 ///
848 /// # Examples
849 ///
850 /// ```
851 /// # use serde_json::json;
852 /// #
853 /// use serde_json::map::Entry;
854 ///
855 /// let mut map = serde_json::Map::new();
856 /// map.insert("serde".to_owned(), json!(12));
857 ///
858 /// match map.entry("serde") {
859 /// Entry::Occupied(occupied) => {
860 /// assert_eq!(occupied.remove(), 12);
861 /// }
862 /// Entry::Vacant(_) => unimplemented!(),
863 /// }
864 /// ```
865 #[inline]
866 pub fn remove(self) -> Value {
867 #[cfg(feature = "preserve_order")]
868 return self.occupied.swap_remove();
869 #[cfg(not(feature = "preserve_order"))]
870 return self.occupied.remove();
871 }
872}
873
874//////////////////////////////////////////////////////////////////////////////
875
876impl<'a> IntoIterator for &'a Map<String, Value> {
877 type Item = (&'a String, &'a Value);
878 type IntoIter = Iter<'a>;
879 #[inline]
880 fn into_iter(self) -> Self::IntoIter {
881 Iter {
882 iter: self.map.iter(),
883 }
884 }
885}
886
887/// An iterator over a serde_json::Map's entries.
888pub struct Iter<'a> {
889 iter: IterImpl<'a>,
890}
891
892#[cfg(not(feature = "preserve_order"))]
893type IterImpl<'a> = btree_map::Iter<'a, String, Value>;
894#[cfg(feature = "preserve_order")]
895type IterImpl<'a> = indexmap::map::Iter<'a, String, Value>;
896
897delegate_iterator!((Iter<'a>) => (&'a String, &'a Value));
898
899//////////////////////////////////////////////////////////////////////////////
900
901impl<'a> IntoIterator for &'a mut Map<String, Value> {
902 type Item = (&'a String, &'a mut Value);
903 type IntoIter = IterMut<'a>;
904 #[inline]
905 fn into_iter(self) -> Self::IntoIter {
906 IterMut {
907 iter: self.map.iter_mut(),
908 }
909 }
910}
911
912/// A mutable iterator over a serde_json::Map's entries.
913pub struct IterMut<'a> {
914 iter: IterMutImpl<'a>,
915}
916
917#[cfg(not(feature = "preserve_order"))]
918type IterMutImpl<'a> = btree_map::IterMut<'a, String, Value>;
919#[cfg(feature = "preserve_order")]
920type IterMutImpl<'a> = indexmap::map::IterMut<'a, String, Value>;
921
922delegate_iterator!((IterMut<'a>) => (&'a String, &'a mut Value));
923
924//////////////////////////////////////////////////////////////////////////////
925
926impl IntoIterator for Map<String, Value> {
927 type Item = (String, Value);
928 type IntoIter = IntoIter;
929 #[inline]
930 fn into_iter(self) -> Self::IntoIter {
931 IntoIter {
932 iter: self.map.into_iter(),
933 }
934 }
935}
936
937/// An owning iterator over a serde_json::Map's entries.
938pub struct IntoIter {
939 iter: IntoIterImpl,
940}
941
942#[cfg(not(feature = "preserve_order"))]
943type IntoIterImpl = btree_map::IntoIter<String, Value>;
944#[cfg(feature = "preserve_order")]
945type IntoIterImpl = indexmap::map::IntoIter<String, Value>;
946
947delegate_iterator!((IntoIter) => (String, Value));
948
949//////////////////////////////////////////////////////////////////////////////
950
951/// An iterator over a serde_json::Map's keys.
952pub struct Keys<'a> {
953 iter: KeysImpl<'a>,
954}
955
956#[cfg(not(feature = "preserve_order"))]
957type KeysImpl<'a> = btree_map::Keys<'a, String, Value>;
958#[cfg(feature = "preserve_order")]
959type KeysImpl<'a> = indexmap::map::Keys<'a, String, Value>;
960
961delegate_iterator!((Keys<'a>) => &'a String);
962
963//////////////////////////////////////////////////////////////////////////////
964
965/// An iterator over a serde_json::Map's values.
966pub struct Values<'a> {
967 iter: ValuesImpl<'a>,
968}
969
970#[cfg(not(feature = "preserve_order"))]
971type ValuesImpl<'a> = btree_map::Values<'a, String, Value>;
972#[cfg(feature = "preserve_order")]
973type ValuesImpl<'a> = indexmap::map::Values<'a, String, Value>;
974
975delegate_iterator!((Values<'a>) => &'a Value);
976
977//////////////////////////////////////////////////////////////////////////////
978
979/// A mutable iterator over a serde_json::Map's values.
980pub struct ValuesMut<'a> {
981 iter: ValuesMutImpl<'a>,
982}
983
984#[cfg(not(feature = "preserve_order"))]
985type ValuesMutImpl<'a> = btree_map::ValuesMut<'a, String, Value>;
986#[cfg(feature = "preserve_order")]
987type ValuesMutImpl<'a> = indexmap::map::ValuesMut<'a, String, Value>;
988
989delegate_iterator!((ValuesMut<'a>) => &'a mut Value);
990