use std::collections::BTreeMap;
use crate::types::Delimiter;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Default)]
pub struct Layout {
nodes: BTreeMap<String, NodeLayout>,
}
impl Layout {
pub fn new() -> Self {
Self::default()
}
pub fn get(&self, json_pointer: &str) -> Option<&NodeLayout> {
self.nodes.get(json_pointer)
}
pub fn iter(&self) -> impl Iterator<Item = (&str, &NodeLayout)> {
self.nodes.iter().map(|(k, v)| (k.as_str(), v))
}
pub fn len(&self) -> usize {
self.nodes.len()
}
pub fn is_empty(&self) -> bool {
self.nodes.is_empty()
}
pub(crate) fn insert(&mut self, json_pointer: String, node: NodeLayout) {
self.nodes.insert(json_pointer, node);
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum NodeLayout {
Tabular {
declared_len: usize,
fields: Vec<FieldDescriptor>,
delimiter: Delimiter,
},
List { declared_len: usize },
InlineArray {
declared_len: usize,
delimiter: Delimiter,
},
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub struct FieldDescriptor {
pub name: String,
pub nested: Option<Box<NodeLayout>>,
}
impl FieldDescriptor {
pub fn leaf(name: impl Into<String>) -> Self {
Self {
name: name.into(),
nested: None,
}
}
}