#![forbid(unsafe_code)]
mod registry;
mod rendering;
mod semantics;
mod structure;
pub use registry::{Meta, RenderingRule, SemanticsRule, StructureRule};
use a11y_dom::{Document, Rendering, 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 rendering_rules<D: Rendering>() -> Vec<RenderingRule<D>> {
rendering::rules()
}
pub fn structure_metas() -> &'static [Meta] {
structure::METAS
}
pub fn semantics_metas() -> &'static [Meta] {
semantics::METAS
}
pub fn rendering_metas() -> &'static [Meta] {
rendering::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 nicht_gelaufen(metas: &'static [Meta], grund: &'static str, report: &mut Report) {
for meta in metas {
for id in meta.ids {
report.record(RuleRun::not_run(*id, NotRun::CapabilityMissing).with_reason(grund));
}
}
}
const OHNE_SEMANTIK: &str = "Host liefert keine Rolle und keinen Accessible Name";
const OHNE_DARSTELLUNG: &str = "Host liefert keine berechneten Stile und keine Geometrie";
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);
nicht_gelaufen(semantics_metas(), OHNE_SEMANTIK, &mut report);
nicht_gelaufen(rendering_metas(), OHNE_DARSTELLUNG, &mut report);
report.finish()
}
pub fn run_with_semantics<D: Semantics>(doc: &D) -> Report {
let mut report = Report::new();
run_structure(doc, &mut report);
run_semantics(doc, &mut report);
nicht_gelaufen(rendering_metas(), OHNE_DARSTELLUNG, &mut report);
report.finish()
}
fn run_semantics<D: Semantics>(doc: &D, report: &mut Report) {
for rule in semantics_rules::<D>() {
let mut out: Vec<Finding> = Vec::new();
(rule.run)(doc, &mut out);
vermerke(&rule.meta, &out, report);
report.extend(out);
}
}
fn run_rendering<D: Rendering>(doc: &D, report: &mut Report) {
for rule in rendering_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_full<D: Semantics + Rendering>(doc: &D) -> Report {
let mut report = Report::new();
run_structure(doc, &mut report);
run_semantics(doc, &mut report);
run_rendering(doc, &mut report);
report.finish()
}
pub fn run_with_rendering<D: Rendering>(doc: &D) -> Report {
let mut report = Report::new();
run_structure(doc, &mut report);
nicht_gelaufen(semantics_metas(), OHNE_SEMANTIK, &mut report);
run_rendering(doc, &mut report);
report.finish()
}