use crate::iter::*;
use alloc::vec::Vec;
use indexmap::IndexMap;
#[derive(Debug)]
pub struct DatDocument<'a> {
pub(crate) document: IndexMap<&'a str, Vec<EntryFragment<'a>>>,
}
impl<'a> DatDocument<'a> {
pub fn entry(&'a self, key: &str) -> Option<impl Iterator<Item = &EntryFragment<'a>>> {
self.document.get(key).map(|f| f.iter())
}
pub fn iter(&'a self) -> SliceIter<'a, EntryFragment<'a>> {
SliceIter::new(self.document.iter())
}
}
#[derive(Debug, Eq, PartialEq)]
pub struct SubEntry<'a> {
pub(crate) keys: IndexMap<&'a str, Node<&'a str>>,
}
impl<'a> SubEntry<'a> {
pub fn value(&'a self, key: &str) -> Option<&'a Node<&'a str>> {
self.keys.get(key)
}
pub fn value_unique(&'a self, key: &str) -> Option<&'a str> {
self.keys.get(key).map(|f| *f.unique())
}
pub fn value_iter(&'a self, key: &str) -> Option<impl Iterator<Item = &'a str>> {
self.keys.get(key).map(|f| f.iter().copied())
}
pub fn iter(&'a self) -> EntryIter<'a, &'a str, Node<&'a str>> {
EntryIter::new(self.keys.iter())
}
}
#[derive(Debug, Eq, PartialEq)]
pub enum EntryData<'a> {
Scalar(&'a str),
SubEntry(SubEntry<'a>),
}
#[derive(Debug, Eq, PartialEq)]
pub enum Node<T> {
Unique(T),
Many(Vec<T>),
}
impl<'a, T> Node<T> {
pub fn iter(&'a self) -> NodeIter<'a, T> {
NodeIter::new(self)
}
pub fn unique(&'a self) -> &T {
match self {
Node::Unique(entry) => entry,
Node::Many(entries) => entries.first().unwrap(),
}
}
}
#[derive(Debug)]
pub struct EntryFragment<'a> {
keys: IndexMap<&'a str, Node<EntryData<'a>>>,
}
impl<'a> EntryFragment<'a> {
#[doc(hidden)]
pub(crate) fn new(keys: IndexMap<&'a str, Node<EntryData<'a>>>) -> Self {
EntryFragment { keys }
}
pub fn entry(&'a self, key: &str) -> Option<&'a Node<EntryData<'a>>> {
self.keys.get(key)
}
pub fn entry_unique(&'a self, key: &str) -> Option<&'a EntryData> {
self.keys.get(key).map(|f| f.unique())
}
pub fn entry_iter(&'a self, key: &str) -> Option<impl Iterator<Item = &'a EntryData>> {
self.keys.get(key).map(|f| f.iter())
}
pub fn iter(&'a self) -> EntryIter<'a, &'a str, Node<EntryData<'a>>> {
EntryIter::new(self.keys.iter())
}
}