use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessibilityIssue {
pub criterion: String,
pub severity: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PageReport {
pub path: String,
pub issues: Vec<AccessibilityIssue>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessibilityReport {
pub pages_scanned: usize,
pub total_issues: usize,
#[serde(default = "default_wcag_version")]
pub wcag_version: String,
pub pages: Vec<PageReport>,
}
pub(crate) fn default_wcag_version() -> String {
"2.2".to_string()
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub enum CriterionStatus {
Automated,
Runtime,
Manual,
NotApplicable,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CriterionEntry {
pub criterion: String,
pub level: String,
pub title: String,
pub status: CriterionStatus,
pub all_pages_pass: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WcagComplianceReport {
pub wcag_version: String,
pub pages_scanned: usize,
pub criteria: Vec<CriterionEntry>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_wcag_version_is_22() {
assert_eq!(default_wcag_version(), "2.2");
}
#[test]
fn accessibility_report_deserialises_without_wcag_version() {
let json = r#"{"pages_scanned":0,"total_issues":0,"pages":[]}"#;
let r: AccessibilityReport = serde_json::from_str(json).unwrap();
assert_eq!(r.wcag_version, "2.2");
}
}