provenance-cli 0.2.3

Command-line interface for Provenance requirements traceability
use crate::output::{self, OutputFormat};
use crate::skills;
use camino::Utf8PathBuf;
use provenance_core::ScopeId;
use provenance_store::{cache, layout::ProvenanceLayout};

#[derive(serde::Serialize)]
struct PrimeOutput {
    #[serde(flatten)]
    view: cache::PrimeContextView,
    skills: skills::SkillInstallStatus,
}

pub(super) fn handle(
    repo: Utf8PathBuf,
    scope: String,
    format: OutputFormat,
    include_threads: bool,
) -> anyhow::Result<()> {
    let skill_status = skills::install_status(repo.as_std_path())?;
    let view = cache::prime_context(
        &ProvenanceLayout::new(repo),
        &ScopeId::new(scope)?,
        include_threads,
    )?;
    if matches!(format, OutputFormat::Markdown | OutputFormat::Toon) {
        let mut rendered = cache::render_prime_markdown(&view);
        rendered.push_str(&skills::render_status_markdown(&skill_status));
        println!("{rendered}");
    } else {
        output::print(
            format,
            &PrimeOutput {
                view,
                skills: skill_status,
            },
        )?;
    }
    Ok(())
}