use serde::Deserialize;
use indexmap::IndexMap;
use crate::names::NodeName;
#[derive(Deserialize)]
pub struct NodeType {
#[serde(flatten)]
pub name: NodeName,
#[serde(flatten)]
pub kind: NodeTypeKind
}
#[derive(Deserialize)]
#[serde(untagged)]
pub enum NodeTypeKind {
Supertype { subtypes: Vec<NodeName> },
Regular {
#[serde(default)]
fields: IndexMap<String, Children>,
#[serde(default)]
children: Option<Children>,
}
}
#[derive(Clone, Deserialize)]
pub struct Children {
pub multiple: bool,
pub required: bool,
pub types: Vec<NodeName>,
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum NodeModule {
Toplevel,
Unnamed,
Symbols
}
impl Extend<Children> for Children {
fn extend<T: IntoIterator<Item=Children>>(&mut self, iter: T) {
for child in iter {
self.required |= child.required;
self.multiple = true;
let len = self.types.len();
self.types.reserve(child.types.len());
for child_type in child.types {
if self.types.iter().take(len).any(|existing_type| &existing_type.rust_type_name == &child_type.rust_type_name) {
continue;
}
self.types.push(child_type);
}
}
}
}