1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//! Der Erweiterungsslot.
//!
//! Der gemeinsame Vertrag kann nicht jedes Feld jedes Werkzeugs aufnehmen —
//! auditmysite hängt etwa einen Element-Screenshot an einen Befund, den es für
//! seinen PDF-Bericht zuschneidet. Solche Daten gehören nicht in den
//! JSON-Vertrag: Sie sind werkzeugspezifisch, oft nicht serialisierbar und für
//! einen fremden Auswerter bedeutungslos.
//!
//! Die naheliegende Alternative — eine Seitentabelle, die Befunde über ihren
//! Index adressiert — trägt nicht: Befunde werden gefiltert, sortiert und aus
//! mehreren Läufen zusammengeführt, und dabei verschieben sich Indizes.
//!
//! Deshalb ein undurchsichtiger Slot am Befund selbst: Er reist mit, wird nie
//! serialisiert und ist **nicht Teil der Identität** eines Befunds. Zwei
//! Befunde mit gleichem Inhalt und verschiedenen Beigaben gelten als gleich.
use Any;
use Arc;
/// Werkzeugspezifische Beigabe an einem [`Finding`](crate::Finding) oder
/// [`RuleRun`](crate::RuleRun). Nie serialisiert.
///
/// ```
/// use a11y_report::{Extra, Finding};
///
/// struct Screenshot(Vec<u8>);
///
/// let f = Finding::fail("images/alt-missing", "kein alt")
/// .with_extra(Screenshot(vec![0x89, 0x50, 0x4e, 0x47]));
///
/// assert_eq!(f.extra.get::<Screenshot>().map(|s| s.0.len()), Some(4));
/// // Eine andere Sorte liegt nicht darin.
/// assert!(f.extra.get::<String>().is_none());
/// ```
;
/// Beigaben zählen nicht zur Identität eines Befunds.
///
/// Sonst wären zwei inhaltlich gleiche Befunde ungleich, nur weil an einem ein
/// Screenshot hängt — und Vergleiche in Tests und beim Zusammenführen von
/// Läufen würden an etwas scheitern, das gar nicht Teil der Aussage ist.