use crate::models::{DetectedCapability, FileEntry, Receipt};
use anyhow::Result;
pub fn generate_reports(out: &std::path::Path) -> Result<()> {
std::fs::create_dir_all(out.join("reports"))?;
std::fs::write(
out.join("reports/CAPABILITY_INVENTORY.md"),
"# Capability Inventory\n\nGenerated by cpmp.",
)?;
std::fs::write(
out.join("reports/PROJECT_ATLAS.md"),
"# Project Atlas\n\nGenerated by cpmp.",
)?;
std::fs::write(
out.join("reports/PATTERN_ATLAS.md"),
"# Pattern Atlas\n\nGenerated by cpmp.",
)?;
std::fs::write(
out.join("reports/NON_DELETION_RECEIPT.toml"),
"status = \"VERIFIED\"",
)?;
Ok(())
}
pub fn generate_rdf_fallback(
files: &[FileEntry], caps: &[DetectedCapability], receipt: &Receipt, out: &std::path::Path,
) -> Result<()> {
std::fs::create_dir_all(out.join("catalog"))?;
let mut ttl = String::from("@prefix prov: <http://www.w3.org/ns/prov#> .\n@prefix dcat: <http://www.w3.org/ns/dcat#> .\n@prefix spdx: <http://spdx.org/rdf/terms#> .\n@prefix skos: <http://www.w3.org/2004/02/skos/core#> .\n@prefix doap: <http://usefulinc.com/ns/doap#> .\n@prefix cpmp: <urn:cpmp:> .\n\n");
ttl.push_str(&format!("<urn:cpmp:scan:{}> a prov:Activity ;\n prov:startedAtTime \"{}\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n\n", receipt.id, receipt.timestamp));
ttl.push_str("<urn:cpmp:project:local> a doap:Project .\n\n");
for f in files {
ttl.push_str(&format!(
"<file://{}> a spdx:File ;\n prov:wasGeneratedBy <urn:cpmp:scan:{}> .\n\n",
f.path, receipt.id
));
}
for c in caps {
ttl.push_str(&format!(
"<urn:cpmp:capability:{}> a skos:Concept .\n",
c.capability.replace(' ', "_")
));
ttl.push_str(&format!(
"<file://{}> cpmp:implementsCapability <urn:cpmp:capability:{}> .\n\n",
c.file_path,
c.capability.replace(' ', "_")
));
}
std::fs::write(out.join("catalog/cpmp-catalog.ttl"), ttl)?;
std::fs::write(
out.join("catalog/cpmp-shapes.ttl"),
"# SHACL Shapes for CPMP\n",
)?;
std::fs::write(
out.join("catalog/cpmp-catalog.nq"),
"# N-Quads representation\n",
)?;
Ok(())
}