use async_trait::async_trait;
use chromiumoxide::Page;
use crate::accessibility::AXTree;
use crate::ai_transparency::AiTransparencyAnalysis;
use crate::ai_visibility::AiVisibilityAnalysis;
use crate::audit::pipeline::PipelineConfig;
use crate::audit::report::{AuditReport, PerformanceResults};
use crate::best_practices::BestPracticesAnalysis;
use crate::content_visibility::ContentVisibilityAnalysis;
use crate::dark_mode::DarkModeAnalysis;
use crate::design_quality::DesignQualityAnalysis;
use crate::error::Result;
use crate::html_conform::HtmlConformAnalysis;
use crate::journey::JourneyAnalysis;
use crate::mobile::MobileFriendliness;
use crate::network::dns::NetworkDnsAnalysis;
use crate::security::SecurityAnalysis;
use crate::seo::SeoAnalysis;
use crate::source_quality::SourceQualityAnalysis;
use crate::tech_stack::TechStackAnalysis;
use crate::ux::UxAnalysis;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Viewport {
Desktop,
Mobile,
}
pub struct ModuleContext<'a> {
pub page: &'a Page,
pub url: &'a str,
pub viewport: Viewport,
pub ax_tree: &'a AXTree,
pub pipeline_config: &'a PipelineConfig,
}
#[derive(Debug, Clone)]
pub enum ModuleData {
None,
Performance(Box<PerformanceResults>),
Seo(Box<SeoAnalysis>),
Security(Box<SecurityAnalysis>),
Mobile(Box<MobileFriendliness>),
Ux(Box<UxAnalysis>),
Journey(Box<JourneyAnalysis>),
DarkMode(Box<DarkModeAnalysis>),
TechStack(Box<TechStackAnalysis>),
BestPractices(Box<BestPracticesAnalysis>),
SourceQuality(Box<SourceQualityAnalysis>),
AiVisibility(Box<AiVisibilityAnalysis>),
ContentVisibility(Box<ContentVisibilityAnalysis>),
DesignQuality(Box<DesignQualityAnalysis>),
AiTransparency(Box<AiTransparencyAnalysis>),
NetworkDns(Box<NetworkDnsAnalysis>),
HtmlConform(Box<HtmlConformAnalysis>),
Error(String),
}
#[async_trait]
pub trait AuditModule: Send + Sync {
fn id(&self) -> &'static str;
fn label(&self) -> &'static str {
self.id()
}
fn is_enabled(&self, cfg: &PipelineConfig) -> bool;
fn depends_on(&self) -> &'static [&'static str] {
&[]
}
async fn collect(&self, _ctx: &ModuleContext<'_>) -> Result<ModuleData> {
Ok(ModuleData::None)
}
fn derive(&self, _report: &mut AuditReport, _locale: &str) -> Result<()> {
Ok(())
}
}