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 "inventory: {}/{} via {}{}\n",
18 report.inventory.scope,
19 report.inventory.scanner,
20 report.inventory.source,
21 migrate_inventory_files_suffix(report.inventory)
22 ));
23 if let Some(root) = report.inventory.root {
24 out.push_str(&format!("source_tree_root: {root}\n"));
25 }
26 out.push_str(report.notes);
27 if !report.notes.ends_with('\n') {
28 out.push('\n');
29 }
30 out.push_str(CLAIM_BOUNDARY_TEXT);
31 out.push('\n');
32 out
33}
34
35fn migrate_inventory_files_suffix(inventory: crate::InventoryContext<'_>) -> String {
36 inventory
37 .files_scanned
38 .map(|files| format!("; files scanned: {files}"))
39 .unwrap_or_default()
40}
41
42pub fn render_migrate_json(report: MigrateReport<'_>) -> String {
43 let mut out = String::new();
44 out.push_str("{\n");
45 push_json_fixed_artifact_preamble(&mut out, MIGRATE_ARTIFACT, report.inventory);
46 out.push_str(" \"input\": {\n");
47 out.push_str(&format!(
48 " \"kind\": \"{}\",\n",
49 json_escape(report.input_kind)
50 ));
51 out.push_str(&format!(
52 " \"path\": \"{}\"\n",
53 json_escape(report.input_path)
54 ));
55 out.push_str(" },\n");
56 out.push_str(" \"output\": {\n");
57 out.push_str(&format!(
58 " \"path\": \"{}\",\n",
59 json_escape(report.output_path)
60 ));
61 out.push_str(&format!(" \"force\": {}\n", bool_json(report.force)));
62 out.push_str(" },\n");
63 out.push_str(" \"summary\": {\n");
64 out.push_str(&format!(
65 " \"allow_entries\": {},\n",
66 report.allow_entries
67 ));
68 out.push_str(&format!(
69 " \"baseline_debt\": {},\n",
70 report.baseline_debt
71 ));
72 out.push_str(&format!(
73 " \"unsafe_entries\": {},\n",
74 report.unsafe_entries
75 ));
76 out.push_str(&format!(
77 " \"entries_with_evidence\": {}\n",
78 report.entries_with_evidence
79 ));
80 out.push_str(" },\n");
81 out.push_str(&format!(" \"notes\": \"{}\"\n", json_escape(report.notes)));
82 out.push_str("}\n");
83 out
84}