1use serde::{Deserialize, Serialize};
2
3use crate::finding::Finding;
4use crate::page::PageRef;
5use crate::score::CategoryScores;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct AuditTarget {
9 pub path_or_url: String,
10 pub kind: TargetKind,
11}
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(rename_all = "snake_case")]
15pub enum TargetKind {
16 Directory,
17 Url,
18 File,
19 Missing,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct PageAudit {
24 pub page: PageRef,
25 pub findings: Vec<Finding>,
26 pub scores: CategoryScores,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct AuditReport {
31 pub core_version: String,
32 pub target: AuditTarget,
33 pub pages: Vec<PageAudit>,
34 pub findings: Vec<Finding>,
35 pub scores: CategoryScores,
36 pub page_count: usize,
37}
38
39impl AuditReport {
40 pub fn new(target: AuditTarget, pages: Vec<PageAudit>) -> Self {
41 let findings: Vec<Finding> = pages.iter().flat_map(|p| p.findings.clone()).collect();
42 let scores = CategoryScores::from_findings(&findings);
43 let page_count = pages.len();
44
45 Self {
46 core_version: env!("CARGO_PKG_VERSION").to_string(),
47 target,
48 pages,
49 findings,
50 scores,
51 page_count,
52 }
53 }
54}