#![forbid(unsafe_code)]
mod registry;
mod semantics;
mod structure;
pub use registry::{Meta, SemanticsRule, StructureRule};
use a11y_dom::{Document, Semantics};
use a11y_report::{Finding, NotRun, Report, RuleRun};
pub fn structure_rules<D: Document>() -> Vec<StructureRule<D>> {
structure::rules()
}
pub fn semantics_rules<D: Semantics>() -> Vec<SemanticsRule<D>> {
semantics::rules()
}
pub fn structure_metas() -> &'static [Meta] {
structure::METAS
}
pub fn semantics_metas() -> &'static [Meta] {
semantics::METAS
}
fn vermerke(meta: &Meta, gefunden: &[Finding], report: &mut Report) {
for id in meta.ids {
let anzahl = gefunden.iter().filter(|f| f.rule_id == *id).count();
report.record(RuleRun::ran(*id, anzahl));
}
}
fn run_structure<D: Document>(doc: &D, report: &mut Report) {
for rule in structure_rules::<D>() {
let mut out: Vec<Finding> = Vec::new();
(rule.run)(doc, &mut out);
vermerke(&rule.meta, &out, report);
report.extend(out);
}
}
pub fn run<D: Document>(doc: &D) -> Report {
let mut report = Report::new();
run_structure(doc, &mut report);
for meta in semantics_metas() {
for id in meta.ids {
report.record(
RuleRun::not_run(*id, NotRun::CapabilityMissing)
.with_reason("Host liefert keine Rolle und keinen Accessible Name"),
);
}
}
report.finish()
}
pub fn run_with_semantics<D: Semantics>(doc: &D) -> Report {
let mut report = Report::new();
run_structure(doc, &mut report);
for rule in semantics_rules::<D>() {
let mut out: Vec<Finding> = Vec::new();
(rule.run)(doc, &mut out);
vermerke(&rule.meta, &out, &mut report);
report.extend(out);
}
report.finish()
}