Skip to main content

allow_report/
migrate.rs

1use crate::contracts::MIGRATE_ARTIFACT;
2use crate::json::{bool_json, push_json_fixed_artifact_preamble};
3use crate::{CLAIM_BOUNDARY_TEXT, MigrateReport};
4use allow_core::json_escape;
5
6pub fn render_migrate_human(report: MigrateReport<'_>) -> String {
7    let mut out = String::new();
8    out.push_str("cargo-allow migrate summary\n");
9    out.push_str(&format!("input_kind: {}\n", report.input_kind));
10    out.push_str(&format!("input: {}\n", report.input_path));
11    out.push_str(&format!("output: {}\n", report.output_path));
12    out.push_str(&format!("force: {}\n", report.force));
13    out.push_str(&format!("allow_entries: {}\n", report.allow_entries));
14    out.push_str(&format!("baseline_debt: {}\n", report.baseline_debt));
15    out.push_str(&format!("unsafe_entries: {}\n", report.unsafe_entries));
16    out.push_str(&format!(
17        "lint_exception_entries: {}\n",
18        report.lint_exception_entries
19    ));
20    out.push_str(&format!(
21        "entries_with_evidence: {}\n",
22        report.entries_with_evidence
23    ));
24    if let Some(count) = report.weak_evidence_references.filter(|count| *count > 0) {
25        out.push_str(&format!("weak_evidence_references: {count}\n"));
26    }
27    if let Some(count) = report
28        .unsafe_weak_evidence_references
29        .filter(|count| *count > 0)
30    {
31        out.push_str(&format!("unsafe_weak_evidence_references: {count}\n"));
32    }
33    out.push_str(&format!(
34        "inventory: {}/{} via {}{}\n",
35        report.inventory.scope,
36        report.inventory.scanner,
37        report.inventory.source,
38        migrate_inventory_files_suffix(report.inventory)
39    ));
40    if let Some(root) = report.inventory.root {
41        out.push_str(&format!("source_tree_root: {root}\n"));
42    }
43    out.push_str(report.notes);
44    if !report.notes.ends_with('\n') {
45        out.push('\n');
46    }
47    out.push_str(CLAIM_BOUNDARY_TEXT);
48    out.push('\n');
49    out
50}
51
52fn migrate_inventory_files_suffix(inventory: crate::InventoryContext<'_>) -> String {
53    inventory
54        .files_scanned
55        .map(|files| format!("; files scanned: {files}"))
56        .unwrap_or_default()
57}
58
59pub fn render_migrate_json(report: MigrateReport<'_>) -> String {
60    let mut out = String::new();
61    out.push_str("{\n");
62    push_json_fixed_artifact_preamble(&mut out, MIGRATE_ARTIFACT, report.inventory);
63    out.push_str("  \"input\": {\n");
64    out.push_str(&format!(
65        "    \"kind\": \"{}\",\n",
66        json_escape(report.input_kind)
67    ));
68    out.push_str(&format!(
69        "    \"path\": \"{}\"\n",
70        json_escape(report.input_path)
71    ));
72    out.push_str("  },\n");
73    out.push_str("  \"output\": {\n");
74    out.push_str(&format!(
75        "    \"path\": \"{}\",\n",
76        json_escape(report.output_path)
77    ));
78    out.push_str(&format!("    \"force\": {}\n", bool_json(report.force)));
79    out.push_str("  },\n");
80    out.push_str("  \"summary\": {\n");
81    out.push_str(&format!(
82        "    \"allow_entries\": {},\n",
83        report.allow_entries
84    ));
85    out.push_str(&format!(
86        "    \"baseline_debt\": {},\n",
87        report.baseline_debt
88    ));
89    out.push_str(&format!(
90        "    \"unsafe_entries\": {},\n",
91        report.unsafe_entries
92    ));
93    out.push_str(&format!(
94        "    \"lint_exception_entries\": {},\n",
95        report.lint_exception_entries
96    ));
97    let weak_evidence_references = report.weak_evidence_references.filter(|count| *count > 0);
98    let unsafe_weak_evidence_references = report
99        .unsafe_weak_evidence_references
100        .filter(|count| *count > 0);
101    if weak_evidence_references.is_some() || unsafe_weak_evidence_references.is_some() {
102        out.push_str(&format!(
103            "    \"entries_with_evidence\": {},\n",
104            report.entries_with_evidence
105        ));
106        if let Some(count) = weak_evidence_references {
107            out.push_str(&format!("    \"weak_evidence_references\": {count}"));
108            if unsafe_weak_evidence_references.is_some() {
109                out.push_str(",\n");
110            } else {
111                out.push('\n');
112            }
113        }
114        if let Some(count) = unsafe_weak_evidence_references {
115            out.push_str(&format!(
116                "    \"unsafe_weak_evidence_references\": {count}\n"
117            ));
118        }
119    } else {
120        out.push_str(&format!(
121            "    \"entries_with_evidence\": {}\n",
122            report.entries_with_evidence
123        ));
124    }
125    out.push_str("  },\n");
126    out.push_str(&format!("  \"notes\": \"{}\"\n", json_escape(report.notes)));
127    out.push_str("}\n");
128    out
129}