a11y_rules/registry.rs
1//! Regeln als Funktionszeiger, nach Tier getrennt registriert.
2//!
3//! Keine Trait-Objekte: Eine Regel ist ein `fn`, die Registry ist ein Slice.
4//! Das monomorphisiert pro Host, allokiert nichts pro Regel und hält die
5//! Tier-Grenze im Typsystem — eine Tier-2-Regel kann gar nicht erst mit einem
6//! Host aufgerufen werden, der [`Semantics`] nicht erfüllt.
7//!
8//! [`Semantics`]: a11y_dom::Semantics
9
10use a11y_dom::{Document, Rendering, Semantics, Tier};
11use a11y_report::{Finding, Severity};
12
13/// Was über eine Regel unabhängig vom Host feststeht.
14///
15/// `ids` listet **alle** Befund-Kennungen, die diese Regel erzeugen kann.
16/// Das ist kein Beiwerk: [`RuleRun`] wird je Kennung geführt, damit
17/// `rule_runs` und `findings` dieselbe Namensmenge benutzen und sich
18/// verbinden lassen. Eine Regel, die `images/alt` hieße, aber
19/// `images/alt-missing` meldete, wäre für einen Auswerter nicht zuordenbar.
20///
21/// [`RuleRun`]: a11y_report::RuleRun
22#[derive(Debug, Clone, Copy)]
23pub struct Meta {
24 /// Alle Befund-Kennungen dieser Regel, stabil über alle Oberflächen.
25 pub ids: &'static [&'static str],
26 /// Welche Datenschicht die Regel braucht.
27 pub tier: Tier,
28 /// WCAG-Erfolgskriterien, z. B. `["1.1.1"]`.
29 pub wcag: &'static [&'static str],
30 /// Vorgabeschwere. Einzelne Befunde dürfen davon abweichen.
31 pub severity: Severity,
32 pub help: &'static str,
33}
34
35/// Eine Regel auf [`Tier::Structure`] — Tags, Attribute, Text, Hierarchie.
36pub struct StructureRule<D: Document> {
37 pub meta: Meta,
38 pub run: fn(&D, &mut Vec<Finding>),
39}
40
41impl<D: Document> Clone for StructureRule<D> {
42 fn clone(&self) -> Self {
43 *self
44 }
45}
46
47impl<D: Document> Copy for StructureRule<D> {}
48
49/// Eine Regel auf [`Tier::Semantics`] — braucht Rolle und Accessible Name.
50pub struct SemanticsRule<D: Semantics> {
51 pub meta: Meta,
52 pub run: fn(&D, &mut Vec<Finding>),
53}
54
55impl<D: Semantics> Clone for SemanticsRule<D> {
56 fn clone(&self) -> Self {
57 *self
58 }
59}
60
61impl<D: Semantics> Copy for SemanticsRule<D> {}
62
63/// Eine Regel auf [`Tier::Rendering`] — braucht berechnete Stile und Geometrie.
64pub struct RenderingRule<D: Rendering> {
65 pub meta: Meta,
66 pub run: fn(&D, &mut Vec<Finding>),
67}
68
69impl<D: Rendering> Clone for RenderingRule<D> {
70 fn clone(&self) -> Self {
71 *self
72 }
73}
74
75impl<D: Rendering> Copy for RenderingRule<D> {}