provenance-cli 0.2.3

Command-line interface for Provenance requirements traceability
use super::common::{resolution_inputs, stable_ids};
use super::references::{self, ResolutionList};
use crate::cli::policy::ResolutionsCommand;
use crate::output;
use provenance_core::{ResolutionStatus, ScopeId, StableId};
use provenance_store::{
    layout::ProvenanceLayout,
    state_store::{CreateResolutionInput, StateStore},
};

pub(super) async fn handle(command: ResolutionsCommand) -> anyhow::Result<()> {
    match command {
        ResolutionsCommand::Update(args) => {
            super::updates::handle::<provenance_store::operations::catalog::UpdateResolution>(args)
                .await?;
        }
        ResolutionsCommand::Create {
            repo,
            scope,
            id,
            title,
            requirement_id,
            supersedes,
            position,
            rationale,
            status,
            context,
            enforcement,
            confidence,
            input_type,
            input_reference,
            input_summary,
            made_by,
            approved_by,
            approved_at,
            origin_thread,
            origin_message,
            format,
        } => {
            let resolution = StateStore::new(ProvenanceLayout::new(repo)).create_resolution(
                CreateResolutionInput {
                    scope_id: ScopeId::new(scope)?,
                    id: StableId::new(id)?,
                    title,
                    requirement_ids: stable_ids(requirement_id)?,
                    supersedes: stable_ids(supersedes)?,
                    position,
                    rationale,
                    status: ResolutionStatus::parse(&status)?,
                    context,
                    enforcement,
                    confidence,
                    inputs: resolution_inputs(input_type, input_reference, input_summary)?,
                    made_by,
                    approved_by,
                    approved_at,
                    origin_thread: origin_thread.map(StableId::new).transpose()?,
                    origin_message: origin_message.map(StableId::new).transpose()?,
                },
            )?;
            output::print(format, &resolution)?;
        }
        ResolutionsCommand::Requirement { command } => {
            references::resolution_list(ResolutionList::Requirement, command)?;
        }
        ResolutionsCommand::Supersedes { command } => {
            references::resolution_list(ResolutionList::Supersedes, command)?;
        }
    }
    Ok(())
}