use super::*;
use indexmap::map::{Iter, Keys, Values};
impl OrderedMap {
#[inline]
pub fn get(&self, key: &str) -> Option<Value> {
self.inner.get(key).map(|f| f.value.value.to_owned())
}
#[inline]
pub fn get_bool(&self, key: &str) -> Option<bool> {
self.get(key).and_then(|f| bool::try_from(f).ok())
}
#[inline]
pub fn get_string(&self, key: &str) -> Option<String> {
self.get(key).and_then(|f| String::try_from(f.to_owned()).ok())
}
}
impl OrderedMap {
#[inline]
pub fn extract(&mut self, key: &str) -> Option<Value> {
self.inner.remove(key).map(|f| f.value.value.to_owned())
}
#[inline]
pub fn extract_bool(&mut self, key: &str) -> Option<bool> {
self.extract(key).and_then(|f| bool::try_from(f).ok())
}
#[inline]
pub fn extract_string(&mut self, key: &str) -> Option<String> {
self.extract(key).and_then(|f| String::try_from(f).ok())
}
}
impl OrderedMap {
#[inline]
pub fn iter(&self) -> OrderedMapIter {
OrderedMapIter { inner: self.inner.iter() }
}
#[inline]
pub fn iter_raw(&self) -> OrderedMapIterRaw {
OrderedMapIterRaw { inner: self.inner.iter() }
}
#[inline]
pub fn keys(&self) -> OrderedMapKeys {
OrderedMapKeys { inner: self.inner.keys() }
}
#[inline]
pub fn values(&self) -> OrderedMapValues {
OrderedMapValues { inner: self.inner.values() }
}
}
impl<'a> IntoIterator for &'a OrderedMap {
type Item = (&'a String, &'a Value);
type IntoIter = OrderedMapIter<'a>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
pub struct OrderedMapIter<'a> {
inner: Iter<'a, String, LiteralPair>,
}
impl<'a> Iterator for OrderedMapIter<'a> {
type Item = (&'a String, &'a Value);
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(k, v)| (k, &v.value.value))
}
}
impl<'a> ExactSizeIterator for OrderedMapIter<'a> {
#[inline]
fn len(&self) -> usize {
self.inner.len()
}
}
pub struct OrderedMapIterRaw<'a> {
inner: Iter<'a, String, LiteralPair>,
}
impl<'a> Iterator for OrderedMapIterRaw<'a> {
type Item = (&'a Literal<String>, &'a Literal<Value>);
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, v)| (&v.key, &v.value))
}
}
pub struct OrderedMapKeys<'a> {
inner: Keys<'a, String, LiteralPair>,
}
impl<'a> Iterator for OrderedMapKeys<'a> {
type Item = &'a String;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
}
pub struct OrderedMapValues<'a> {
inner: Values<'a, String, LiteralPair>,
}
impl<'a> Iterator for OrderedMapValues<'a> {
type Item = &'a Value;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|f| &f.value.value)
}
}
impl<'a> DoubleEndedIterator for OrderedMapValues<'a> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|f| &f.value.value)
}
}