cpmp 0.1.0

Computer Project Mapping Protocol — scanner, capability classification, projection, receipts.
Documentation
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(())
}