1 // Copyright 2017 Serde Developers 2 // 3 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or 4 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license 5 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your 6 // option. This file may not be copied, modified, or distributed 7 // except according to those terms. 8 9 //! A map of `String` to [Value]. 10 //! 11 //! By default the map is backed by a [`BTreeMap`]. Enable the `preserve_order` 12 //! feature of toml-rs to use [`IndexMap`] instead. 13 //! 14 //! [`BTreeMap`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html 15 //! [`IndexMap`]: https://docs.rs/indexmap 16 17 use crate::value::Value; 18 use serde::{de, ser}; 19 use std::borrow::Borrow; 20 use std::fmt::{self, Debug}; 21 use std::hash::Hash; 22 use std::iter::FromIterator; 23 use std::ops; 24 25 #[cfg(not(feature = "preserve_order"))] 26 use std::collections::{btree_map, BTreeMap}; 27 28 #[cfg(feature = "preserve_order")] 29 use indexmap::{self, IndexMap}; 30 31 /// Represents a TOML key/value type. 32 pub struct Map<K, V> { 33 map: MapImpl<K, V>, 34 } 35 36 #[cfg(not(feature = "preserve_order"))] 37 type MapImpl<K, V> = BTreeMap<K, V>; 38 #[cfg(feature = "preserve_order")] 39 type MapImpl<K, V> = IndexMap<K, V>; 40 41 impl Map<String, Value> { 42 /// Makes a new empty Map. 43 #[inline] new() -> Self44 pub fn new() -> Self { 45 Map { 46 map: MapImpl::new(), 47 } 48 } 49 50 #[cfg(not(feature = "preserve_order"))] 51 /// Makes a new empty Map with the given initial capacity. 52 #[inline] with_capacity(capacity: usize) -> Self53 pub fn with_capacity(capacity: usize) -> Self { 54 // does not support with_capacity 55 let _ = capacity; 56 Map { 57 map: BTreeMap::new(), 58 } 59 } 60 61 #[cfg(feature = "preserve_order")] 62 /// Makes a new empty Map with the given initial capacity. 63 #[inline] with_capacity(capacity: usize) -> Self64 pub fn with_capacity(capacity: usize) -> Self { 65 Map { 66 map: IndexMap::with_capacity(capacity), 67 } 68 } 69 70 /// Clears the map, removing all values. 71 #[inline] clear(&mut self)72 pub fn clear(&mut self) { 73 self.map.clear() 74 } 75 76 /// Returns a reference to the value corresponding to the key. 77 /// 78 /// The key may be any borrowed form of the map's key type, but the ordering 79 /// on the borrowed form *must* match the ordering on the key type. 80 #[inline] get<Q: ?Sized>(&self, key: &Q) -> Option<&Value> where String: Borrow<Q>, Q: Ord + Eq + Hash,81 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&Value> 82 where 83 String: Borrow<Q>, 84 Q: Ord + Eq + Hash, 85 { 86 self.map.get(key) 87 } 88 89 /// Returns true if the map contains a value for the specified key. 90 /// 91 /// The key may be any borrowed form of the map's key type, but the ordering 92 /// on the borrowed form *must* match the ordering on the key type. 93 #[inline] contains_key<Q: ?Sized>(&self, key: &Q) -> bool where String: Borrow<Q>, Q: Ord + Eq + Hash,94 pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool 95 where 96 String: Borrow<Q>, 97 Q: Ord + Eq + Hash, 98 { 99 self.map.contains_key(key) 100 } 101 102 /// Returns a mutable reference to the value corresponding to the key. 103 /// 104 /// The key may be any borrowed form of the map's key type, but the ordering 105 /// on the borrowed form *must* match the ordering on the key type. 106 #[inline] get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut Value> where String: Borrow<Q>, Q: Ord + Eq + Hash,107 pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut Value> 108 where 109 String: Borrow<Q>, 110 Q: Ord + Eq + Hash, 111 { 112 self.map.get_mut(key) 113 } 114 115 /// Inserts a key-value pair into the map. 116 /// 117 /// If the map did not have this key present, `None` is returned. 118 /// 119 /// If the map did have this key present, the value is updated, and the old 120 /// value is returned. The key is not updated, though; this matters for 121 /// types that can be `==` without being identical. 122 #[inline] insert(&mut self, k: String, v: Value) -> Option<Value>123 pub fn insert(&mut self, k: String, v: Value) -> Option<Value> { 124 self.map.insert(k, v) 125 } 126 127 /// Removes a key from the map, returning the value at the key if the key 128 /// was previously in the map. 129 /// 130 /// The key may be any borrowed form of the map's key type, but the ordering 131 /// on the borrowed form *must* match the ordering on the key type. 132 #[inline] remove<Q: ?Sized>(&mut self, key: &Q) -> Option<Value> where String: Borrow<Q>, Q: Ord + Eq + Hash,133 pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<Value> 134 where 135 String: Borrow<Q>, 136 Q: Ord + Eq + Hash, 137 { 138 self.map.remove(key) 139 } 140 141 /// Retains only the elements specified by the `keep` predicate. 142 /// 143 /// In other words, remove all pairs `(k, v)` for which `keep(&k, &mut v)` 144 /// returns `false`. 145 /// 146 /// The elements are visited in iteration order. 147 #[inline] retain<F>(&mut self, mut keep: F) where F: FnMut(&str, &mut Value) -> bool,148 pub fn retain<F>(&mut self, mut keep: F) 149 where 150 F: FnMut(&str, &mut Value) -> bool, 151 { 152 self.map.retain(|key, value| keep(key.as_str(), value)); 153 } 154 155 /// Gets the given key's corresponding entry in the map for in-place 156 /// manipulation. entry<S>(&mut self, key: S) -> Entry<'_> where S: Into<String>,157 pub fn entry<S>(&mut self, key: S) -> Entry<'_> 158 where 159 S: Into<String>, 160 { 161 #[cfg(feature = "preserve_order")] 162 use indexmap::map::Entry as EntryImpl; 163 #[cfg(not(feature = "preserve_order"))] 164 use std::collections::btree_map::Entry as EntryImpl; 165 166 match self.map.entry(key.into()) { 167 EntryImpl::Vacant(vacant) => Entry::Vacant(VacantEntry { vacant }), 168 EntryImpl::Occupied(occupied) => Entry::Occupied(OccupiedEntry { occupied }), 169 } 170 } 171 172 /// Returns the number of elements in the map. 173 #[inline] len(&self) -> usize174 pub fn len(&self) -> usize { 175 self.map.len() 176 } 177 178 /// Returns true if the map contains no elements. 179 #[inline] is_empty(&self) -> bool180 pub fn is_empty(&self) -> bool { 181 self.map.is_empty() 182 } 183 184 /// Gets an iterator over the entries of the map. 185 #[inline] iter(&self) -> Iter<'_>186 pub fn iter(&self) -> Iter<'_> { 187 Iter { 188 iter: self.map.iter(), 189 } 190 } 191 192 /// Gets a mutable iterator over the entries of the map. 193 #[inline] iter_mut(&mut self) -> IterMut<'_>194 pub fn iter_mut(&mut self) -> IterMut<'_> { 195 IterMut { 196 iter: self.map.iter_mut(), 197 } 198 } 199 200 /// Gets an iterator over the keys of the map. 201 #[inline] keys(&self) -> Keys<'_>202 pub fn keys(&self) -> Keys<'_> { 203 Keys { 204 iter: self.map.keys(), 205 } 206 } 207 208 /// Gets an iterator over the values of the map. 209 #[inline] values(&self) -> Values<'_>210 pub fn values(&self) -> Values<'_> { 211 Values { 212 iter: self.map.values(), 213 } 214 } 215 } 216 217 impl Default for Map<String, Value> { 218 #[inline] default() -> Self219 fn default() -> Self { 220 Map { 221 map: MapImpl::new(), 222 } 223 } 224 } 225 226 impl Clone for Map<String, Value> { 227 #[inline] clone(&self) -> Self228 fn clone(&self) -> Self { 229 Map { 230 map: self.map.clone(), 231 } 232 } 233 } 234 235 impl PartialEq for Map<String, Value> { 236 #[inline] eq(&self, other: &Self) -> bool237 fn eq(&self, other: &Self) -> bool { 238 self.map.eq(&other.map) 239 } 240 } 241 242 /// Access an element of this map. Panics if the given key is not present in the 243 /// map. 244 impl<'a, Q: ?Sized> ops::Index<&'a Q> for Map<String, Value> 245 where 246 String: Borrow<Q>, 247 Q: Ord + Eq + Hash, 248 { 249 type Output = Value; 250 index(&self, index: &Q) -> &Value251 fn index(&self, index: &Q) -> &Value { 252 self.map.index(index) 253 } 254 } 255 256 /// Mutably access an element of this map. Panics if the given key is not 257 /// present in the map. 258 impl<'a, Q: ?Sized> ops::IndexMut<&'a Q> for Map<String, Value> 259 where 260 String: Borrow<Q>, 261 Q: Ord + Eq + Hash, 262 { index_mut(&mut self, index: &Q) -> &mut Value263 fn index_mut(&mut self, index: &Q) -> &mut Value { 264 self.map.get_mut(index).expect("no entry found for key") 265 } 266 } 267 268 impl Debug for Map<String, Value> { 269 #[inline] fmt(&self, formatter: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error>270 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { 271 self.map.fmt(formatter) 272 } 273 } 274 275 impl ser::Serialize for Map<String, Value> { 276 #[inline] serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: ser::Serializer,277 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 278 where 279 S: ser::Serializer, 280 { 281 use serde::ser::SerializeMap; 282 let mut map = serializer.serialize_map(Some(self.len()))?; 283 for (k, v) in self { 284 map.serialize_key(k)?; 285 map.serialize_value(v)?; 286 } 287 map.end() 288 } 289 } 290 291 impl<'de> de::Deserialize<'de> for Map<String, Value> { 292 #[inline] deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: de::Deserializer<'de>,293 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> 294 where 295 D: de::Deserializer<'de>, 296 { 297 struct Visitor; 298 299 impl<'de> de::Visitor<'de> for Visitor { 300 type Value = Map<String, Value>; 301 302 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { 303 formatter.write_str("a map") 304 } 305 306 #[inline] 307 fn visit_unit<E>(self) -> Result<Self::Value, E> 308 where 309 E: de::Error, 310 { 311 Ok(Map::new()) 312 } 313 314 #[inline] 315 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> 316 where 317 V: de::MapAccess<'de>, 318 { 319 let mut values = Map::new(); 320 321 while let Some((key, value)) = visitor.next_entry()? { 322 values.insert(key, value); 323 } 324 325 Ok(values) 326 } 327 } 328 329 deserializer.deserialize_map(Visitor) 330 } 331 } 332 333 impl FromIterator<(String, Value)> for Map<String, Value> { from_iter<T>(iter: T) -> Self where T: IntoIterator<Item = (String, Value)>,334 fn from_iter<T>(iter: T) -> Self 335 where 336 T: IntoIterator<Item = (String, Value)>, 337 { 338 Map { 339 map: FromIterator::from_iter(iter), 340 } 341 } 342 } 343 344 impl Extend<(String, Value)> for Map<String, Value> { extend<T>(&mut self, iter: T) where T: IntoIterator<Item = (String, Value)>,345 fn extend<T>(&mut self, iter: T) 346 where 347 T: IntoIterator<Item = (String, Value)>, 348 { 349 self.map.extend(iter); 350 } 351 } 352 353 macro_rules! delegate_iterator { 354 (($name:ident $($generics:tt)*) => $item:ty) => { 355 impl $($generics)* Iterator for $name $($generics)* { 356 type Item = $item; 357 #[inline] 358 fn next(&mut self) -> Option<Self::Item> { 359 self.iter.next() 360 } 361 #[inline] 362 fn size_hint(&self) -> (usize, Option<usize>) { 363 self.iter.size_hint() 364 } 365 } 366 367 impl $($generics)* DoubleEndedIterator for $name $($generics)* { 368 #[inline] 369 fn next_back(&mut self) -> Option<Self::Item> { 370 self.iter.next_back() 371 } 372 } 373 374 impl $($generics)* ExactSizeIterator for $name $($generics)* { 375 #[inline] 376 fn len(&self) -> usize { 377 self.iter.len() 378 } 379 } 380 } 381 } 382 383 ////////////////////////////////////////////////////////////////////////////// 384 385 /// A view into a single entry in a map, which may either be vacant or occupied. 386 /// This enum is constructed from the [`entry`] method on [`Map`]. 387 /// 388 /// [`entry`]: struct.Map.html#method.entry 389 /// [`Map`]: struct.Map.html 390 pub enum Entry<'a> { 391 /// A vacant Entry. 392 Vacant(VacantEntry<'a>), 393 /// An occupied Entry. 394 Occupied(OccupiedEntry<'a>), 395 } 396 397 /// A vacant Entry. It is part of the [`Entry`] enum. 398 /// 399 /// [`Entry`]: enum.Entry.html 400 pub struct VacantEntry<'a> { 401 vacant: VacantEntryImpl<'a>, 402 } 403 404 /// An occupied Entry. It is part of the [`Entry`] enum. 405 /// 406 /// [`Entry`]: enum.Entry.html 407 pub struct OccupiedEntry<'a> { 408 occupied: OccupiedEntryImpl<'a>, 409 } 410 411 #[cfg(not(feature = "preserve_order"))] 412 type VacantEntryImpl<'a> = btree_map::VacantEntry<'a, String, Value>; 413 #[cfg(feature = "preserve_order")] 414 type VacantEntryImpl<'a> = indexmap::map::VacantEntry<'a, String, Value>; 415 416 #[cfg(not(feature = "preserve_order"))] 417 type OccupiedEntryImpl<'a> = btree_map::OccupiedEntry<'a, String, Value>; 418 #[cfg(feature = "preserve_order")] 419 type OccupiedEntryImpl<'a> = indexmap::map::OccupiedEntry<'a, String, Value>; 420 421 impl<'a> Entry<'a> { 422 /// Returns a reference to this entry's key. key(&self) -> &String423 pub fn key(&self) -> &String { 424 match *self { 425 Entry::Vacant(ref e) => e.key(), 426 Entry::Occupied(ref e) => e.key(), 427 } 428 } 429 430 /// Ensures a value is in the entry by inserting the default if empty, and 431 /// returns a mutable reference to the value in the entry. or_insert(self, default: Value) -> &'a mut Value432 pub fn or_insert(self, default: Value) -> &'a mut Value { 433 match self { 434 Entry::Vacant(entry) => entry.insert(default), 435 Entry::Occupied(entry) => entry.into_mut(), 436 } 437 } 438 439 /// Ensures a value is in the entry by inserting the result of the default 440 /// function if empty, and returns a mutable reference to the value in the 441 /// entry. or_insert_with<F>(self, default: F) -> &'a mut Value where F: FnOnce() -> Value,442 pub fn or_insert_with<F>(self, default: F) -> &'a mut Value 443 where 444 F: FnOnce() -> Value, 445 { 446 match self { 447 Entry::Vacant(entry) => entry.insert(default()), 448 Entry::Occupied(entry) => entry.into_mut(), 449 } 450 } 451 } 452 453 impl<'a> VacantEntry<'a> { 454 /// Gets a reference to the key that would be used when inserting a value 455 /// through the VacantEntry. 456 #[inline] key(&self) -> &String457 pub fn key(&self) -> &String { 458 self.vacant.key() 459 } 460 461 /// Sets the value of the entry with the VacantEntry's key, and returns a 462 /// mutable reference to it. 463 #[inline] insert(self, value: Value) -> &'a mut Value464 pub fn insert(self, value: Value) -> &'a mut Value { 465 self.vacant.insert(value) 466 } 467 } 468 469 impl<'a> OccupiedEntry<'a> { 470 /// Gets a reference to the key in the entry. 471 #[inline] key(&self) -> &String472 pub fn key(&self) -> &String { 473 self.occupied.key() 474 } 475 476 /// Gets a reference to the value in the entry. 477 #[inline] get(&self) -> &Value478 pub fn get(&self) -> &Value { 479 self.occupied.get() 480 } 481 482 /// Gets a mutable reference to the value in the entry. 483 #[inline] get_mut(&mut self) -> &mut Value484 pub fn get_mut(&mut self) -> &mut Value { 485 self.occupied.get_mut() 486 } 487 488 /// Converts the entry into a mutable reference to its value. 489 #[inline] into_mut(self) -> &'a mut Value490 pub fn into_mut(self) -> &'a mut Value { 491 self.occupied.into_mut() 492 } 493 494 /// Sets the value of the entry with the `OccupiedEntry`'s key, and returns 495 /// the entry's old value. 496 #[inline] insert(&mut self, value: Value) -> Value497 pub fn insert(&mut self, value: Value) -> Value { 498 self.occupied.insert(value) 499 } 500 501 /// Takes the value of the entry out of the map, and returns it. 502 #[inline] remove(self) -> Value503 pub fn remove(self) -> Value { 504 self.occupied.remove() 505 } 506 } 507 508 ////////////////////////////////////////////////////////////////////////////// 509 510 impl<'a> IntoIterator for &'a Map<String, Value> { 511 type Item = (&'a String, &'a Value); 512 type IntoIter = Iter<'a>; 513 #[inline] into_iter(self) -> Self::IntoIter514 fn into_iter(self) -> Self::IntoIter { 515 Iter { 516 iter: self.map.iter(), 517 } 518 } 519 } 520 521 /// An iterator over a toml::Map's entries. 522 pub struct Iter<'a> { 523 iter: IterImpl<'a>, 524 } 525 526 #[cfg(not(feature = "preserve_order"))] 527 type IterImpl<'a> = btree_map::Iter<'a, String, Value>; 528 #[cfg(feature = "preserve_order")] 529 type IterImpl<'a> = indexmap::map::Iter<'a, String, Value>; 530 531 delegate_iterator!((Iter<'a>) => (&'a String, &'a Value)); 532 533 ////////////////////////////////////////////////////////////////////////////// 534 535 impl<'a> IntoIterator for &'a mut Map<String, Value> { 536 type Item = (&'a String, &'a mut Value); 537 type IntoIter = IterMut<'a>; 538 #[inline] into_iter(self) -> Self::IntoIter539 fn into_iter(self) -> Self::IntoIter { 540 IterMut { 541 iter: self.map.iter_mut(), 542 } 543 } 544 } 545 546 /// A mutable iterator over a toml::Map's entries. 547 pub struct IterMut<'a> { 548 iter: IterMutImpl<'a>, 549 } 550 551 #[cfg(not(feature = "preserve_order"))] 552 type IterMutImpl<'a> = btree_map::IterMut<'a, String, Value>; 553 #[cfg(feature = "preserve_order")] 554 type IterMutImpl<'a> = indexmap::map::IterMut<'a, String, Value>; 555 556 delegate_iterator!((IterMut<'a>) => (&'a String, &'a mut Value)); 557 558 ////////////////////////////////////////////////////////////////////////////// 559 560 impl IntoIterator for Map<String, Value> { 561 type Item = (String, Value); 562 type IntoIter = IntoIter; 563 #[inline] into_iter(self) -> Self::IntoIter564 fn into_iter(self) -> Self::IntoIter { 565 IntoIter { 566 iter: self.map.into_iter(), 567 } 568 } 569 } 570 571 /// An owning iterator over a toml::Map's entries. 572 pub struct IntoIter { 573 iter: IntoIterImpl, 574 } 575 576 #[cfg(not(feature = "preserve_order"))] 577 type IntoIterImpl = btree_map::IntoIter<String, Value>; 578 #[cfg(feature = "preserve_order")] 579 type IntoIterImpl = indexmap::map::IntoIter<String, Value>; 580 581 delegate_iterator!((IntoIter) => (String, Value)); 582 583 ////////////////////////////////////////////////////////////////////////////// 584 585 /// An iterator over a toml::Map's keys. 586 pub struct Keys<'a> { 587 iter: KeysImpl<'a>, 588 } 589 590 #[cfg(not(feature = "preserve_order"))] 591 type KeysImpl<'a> = btree_map::Keys<'a, String, Value>; 592 #[cfg(feature = "preserve_order")] 593 type KeysImpl<'a> = indexmap::map::Keys<'a, String, Value>; 594 595 delegate_iterator!((Keys<'a>) => &'a String); 596 597 ////////////////////////////////////////////////////////////////////////////// 598 599 /// An iterator over a toml::Map's values. 600 pub struct Values<'a> { 601 iter: ValuesImpl<'a>, 602 } 603 604 #[cfg(not(feature = "preserve_order"))] 605 type ValuesImpl<'a> = btree_map::Values<'a, String, Value>; 606 #[cfg(feature = "preserve_order")] 607 type ValuesImpl<'a> = indexmap::map::Values<'a, String, Value>; 608 609 delegate_iterator!((Values<'a>) => &'a Value); 610