cargo-allow 0.1.3

Source-tree exception ledger and policy scanner for Rust repositories.
use super::{WorkItem, WorklistContext, WorklistFilters};

pub(super) fn render_worklist_json_with_context(
    items: &[WorkItem],
    context: WorklistContext<'_>,
) -> String {
    let report_items = report_worklist_items(items);
    allow_report::render_worklist_json(
        &report_items,
        report_worklist_filters(context.filters),
        context.inventory,
    )
}

pub(super) fn render_worklist_human_with_context(
    items: &[WorkItem],
    context: WorklistContext<'_>,
) -> String {
    let report_items = report_worklist_items(items);
    allow_report::render_worklist_human(
        &report_items,
        report_worklist_filters(context.filters),
        context.inventory,
    )
}

fn report_worklist_items(items: &[WorkItem]) -> Vec<allow_report::WorklistItem<'_>> {
    items
        .iter()
        .map(|item| allow_report::WorklistItem {
            id: &item.id,
            kind: &item.kind,
            exception_kind: item.exception_kind.as_deref(),
            family: item.family.as_deref(),
            owner: item.owner.as_deref(),
            classification: item.classification.as_deref(),
            reason: item.reason.as_deref(),
            created: item.created.as_deref(),
            review_after: item.review_after.as_deref(),
            expires: item.expires.as_deref(),
            evidence_count: item.evidence_count,
            selector_precision: item.selector_precision,
            risk: item.risk,
            difficulty: item.difficulty,
            status: item.status.as_str(),
            allow_id: item.allow_id.as_deref(),
            finding_index: item.finding_index,
            path: item.path.as_deref(),
            evidence_reference: item.evidence_reference.as_ref().map(|reference| {
                allow_report::EvidenceReference {
                    raw: &reference.raw,
                    prefix: reference.prefix.as_deref(),
                    target: reference.target.as_deref(),
                    status: &reference.status,
                    category: &reference.category,
                    message: &reference.message,
                }
            }),
            source_package: item.source_package.as_deref(),
            message: &item.message,
            suggested_actions: &item.suggested_actions,
            proof_commands: &item.proof_commands,
        })
        .collect()
}

fn report_worklist_filters(filters: WorklistFilters<'_>) -> allow_report::WorklistFilters<'_> {
    allow_report::WorklistFilters {
        kind: filters.kind,
        family: filters.family,
        item_kind: filters.item_kind,
        status: filters.status,
        allow_id: filters.allow_id,
        path: filters.path,
        source_package: filters.source_package,
        owner: filters.owner,
        classification: filters.classification,
        baseline_debt: filters.baseline_debt,
        broad_scope: filters.broad_scope,
        risk: filters.risk,
        difficulty: filters.difficulty,
        missing_evidence: filters.missing_evidence,
    }
}