mod accordion;
mod disclosure_menu;
mod main_navigation;
mod modal_dialog;
mod skip_link;
mod tab_list;
use serde::{Deserialize, Serialize};
use crate::accessibility::AXTree;
use crate::wcag::types::Violation;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PatternAnalysis {
pub recognized: Vec<RecognizedPattern>,
pub violations: Vec<Violation>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RecognizedPattern {
pub pattern: String,
pub message: String,
pub confidence: PatternConfidence,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum PatternConfidence {
Strong,
Partial,
}
impl PatternAnalysis {
pub fn add_recognized(
&mut self,
pattern: &str,
message: impl Into<String>,
confidence: PatternConfidence,
) {
self.recognized.push(RecognizedPattern {
pattern: pattern.to_string(),
message: message.into(),
confidence,
});
}
}
pub fn analyze(tree: &AXTree) -> PatternAnalysis {
let mut result = PatternAnalysis::default();
main_navigation::detect(tree, &mut result);
disclosure_menu::detect(tree, &mut result);
modal_dialog::detect(tree, &mut result);
tab_list::detect(tree, &mut result);
skip_link::detect(tree, &mut result);
accordion::detect(tree, &mut result);
result
}