oratos 0.3.1

Website visibility intelligence for SEO, accessibility, structured metadata, and AI readiness.
Documentation
use serde::{Deserialize, Serialize};

use super::finding::Finding;
use super::page::PageRef;
use super::score::CategoryScores;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditTarget {
    pub path_or_url: String,
    pub kind: TargetKind,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TargetKind {
    Directory,
    Url,
    File,
    Missing,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PageAudit {
    pub page: PageRef,
    pub findings: Vec<Finding>,
    pub scores: CategoryScores,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditReport {
    pub core_version: String,
    pub target: AuditTarget,
    pub pages: Vec<PageAudit>,
    pub findings: Vec<Finding>,
    pub scores: CategoryScores,
    pub page_count: usize,
}

impl AuditReport {
    pub fn new(target: AuditTarget, pages: Vec<PageAudit>) -> Self {
        let findings: Vec<Finding> = pages.iter().flat_map(|p| p.findings.clone()).collect();
        let scores = CategoryScores::from_findings(&findings);
        let page_count = pages.len();

        Self {
            core_version: env!("CARGO_PKG_VERSION").to_string(),
            target,
            pages,
            findings,
            scores,
            page_count,
        }
    }
}