1use fc_diff::{diff_lines, diff_stats};
8
9fn main() {
10 let mut args = std::env::args().skip(1);
11 let before = args.next().unwrap_or_default();
12 let after = args.next().unwrap_or_default();
13
14 let lines = diff_lines(&before, &after);
15 let stats = diff_stats(&lines);
16
17 print!("{{\"added\":{},\"removed\":{},\"identical\":{},\"lines\":[", stats.added, stats.removed, stats.identical);
20 for (i, line) in lines.iter().enumerate() {
21 if i > 0 {
22 print!(",");
23 }
24 print!(
25 "{{\"kind\":{},\"text\":{},\"oldLine\":{},\"newLine\":{}}}",
26 json_str(line.kind.as_str()),
27 json_str(&line.text),
28 line.old_line.map(|n| n.to_string()).unwrap_or_else(|| "null".into()),
29 line.new_line.map(|n| n.to_string()).unwrap_or_else(|| "null".into()),
30 );
31 }
32 println!("]}}");
33}
34
35fn json_str(value: &str) -> String {
36 let mut out = String::with_capacity(value.len() + 2);
37 out.push('"');
38 for ch in value.chars() {
39 match ch {
40 '"' => out.push_str("\\\""),
41 '\\' => out.push_str("\\\\"),
42 '\n' => out.push_str("\\n"),
43 '\r' => out.push_str("\\r"),
44 '\t' => out.push_str("\\t"),
45 c if (c as u32) < 0x20 => out.push_str(&format!("\\u{:04x}", c as u32)),
46 c => out.push(c),
47 }
48 }
49 out.push('"');
50 out
51}