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}