use ifc_material::{Material, MaterialProperties, MaterialResult};
use ifc_template_catalog::catalog::Catalog;
use ifc_template_catalog::definition::SetTemplate;
use ifc_template_catalog::query::{ApplicabilityTarget, ExactEntityHierarchy};
fn query<'c>(catalog: &'c Catalog, qualifier: Option<&str>) -> Vec<&'c SetTemplate> {
catalog
.applicable_to(
&ApplicabilityTarget::new("IfcMaterial", qualifier),
&ExactEntityHierarchy,
)
.into_iter()
.filter(|template| template.is_property_set())
.collect()
}
pub fn applicable_to<'c>(
material: Material<'_>,
catalog: &'c Catalog,
) -> MaterialResult<Vec<&'c SetTemplate>> {
material.name()?;
Ok(query(catalog, None))
}
pub fn applicable_to_category<'c>(
material: Material<'_>,
catalog: &'c Catalog,
) -> MaterialResult<Vec<&'c SetTemplate>> {
material.name()?;
let category = material.category()?;
Ok(query(catalog, category))
}
pub fn template_for<'c>(
properties: MaterialProperties<'_>,
catalog: &'c Catalog,
) -> MaterialResult<Option<&'c SetTemplate>> {
Ok(properties.name()?.and_then(|name| {
catalog.get(name).filter(|template| {
template.is_property_set()
&& template
.applicability
.iter()
.any(|selector| selector.entity.eq_ignore_ascii_case("IfcMaterial"))
})
}))
}