use std::collections::HashMap;
use super::requirement::PropertyRequirement;
#[derive(Debug, Clone, Default)]
pub struct RequiredPropertiesMap {
requirements: HashMap<i64, Vec<PropertyRequirement>>,
}
impl RequiredPropertiesMap {
pub fn record(&mut self, node_id: i64, requirements: &[PropertyRequirement]) {
self.requirements.insert(node_id, requirements.to_vec());
}
pub fn get(&self, node_id: i64) -> Option<&[PropertyRequirement]> {
self.requirements.get(&node_id).map(Vec::as_slice)
}
pub fn requirement_for_var(&self, node_id: i64, var: &str) -> Option<PropertyRequirement> {
let mut merged: Option<PropertyRequirement> = None;
for req in self.requirements.get(&node_id)? {
if req.alias == var {
match merged.as_mut() {
Some(acc) => acc.merge(req),
None => merged = Some(req.clone()),
}
}
}
merged
}
pub fn narrowable_properties(&self, node_id: i64, var: &str) -> Option<Vec<String>> {
let req = self.requirement_for_var(node_id, var)?;
if !req.is_narrowable() {
return None;
}
Some(req.prop_names.into_iter().collect())
}
}