Skip to main content

ifc_validate/structure/
mod.rs

1//! Structural conformance: references, slots, cardinality, uniqueness.
2//!
3//! ## Internals
4//!
5//! - `reference`: dangling and wrong-kind references
6//! - `required`: required/derived slot presence and record arity
7//! - `cardinality`: scalar-vs-aggregate shape
8//! - `unique`: duplicate `GlobalId`s
9
10mod cardinality;
11mod reference;
12mod required;
13mod unique;
14
15pub use cardinality::aggregate_shape;
16pub(crate) use reference::expected_references;
17pub use reference::{dangling_references, wrong_kind_references};
18pub use required::required_attributes;
19pub use unique::duplicate_global_ids;
20
21use ifc_model::Model;
22use ifc_schema::Schema;
23
24use crate::report::Report;
25use crate::where_rule::Budget;
26
27/// Every structural check, in a fixed order.
28///
29/// Order is fixed so two runs over the same file produce identical reports;
30/// the report sorts findings anyway, but a stable production order keeps
31/// truncation deterministic when the budget is hit.
32pub fn check(model: &Model, schema: &Schema, budget: Budget, report: &mut Report) {
33    dangling_references(model, report);
34    wrong_kind_references(model, schema, report);
35    required_attributes(model, schema, report);
36    aggregate_shape(model, schema, report);
37    if report.findings().len() >= budget.max_findings {
38        report.mark_truncated();
39    }
40}