semdiff_differ_text/
report_json.rs1use crate::{TextDiff, TextDiffReporter, is_text_file};
2use semdiff_core::fs::FileLeaf;
3use semdiff_core::{DetailReporter, MayUnsupported};
4use semdiff_output::json::JsonReport;
5use serde::Serialize;
6use similar::ChangeTag;
7use std::convert;
8
9const COMPARES_NAME: &str = "text";
10
11impl<W> DetailReporter<TextDiff, FileLeaf, JsonReport<W>> for TextDiffReporter {
12 type Error = convert::Infallible;
13
14 fn report_unchanged(
15 &self,
16 name: &str,
17 _diff: TextDiff,
18 reporter: &JsonReport<W>,
19 ) -> Result<MayUnsupported<()>, Self::Error> {
20 reporter.record_unchanged(name, COMPARES_NAME, ());
21 Ok(MayUnsupported::Ok(()))
22 }
23
24 fn report_modified(
25 &self,
26 name: &str,
27 diff: TextDiff,
28 reporter: &JsonReport<W>,
29 ) -> Result<MayUnsupported<()>, Self::Error> {
30 let s = diff
31 .diff()
32 .iter_all_changes()
33 .fold(S::default(), |S { added, deleted }, change| match change.tag() {
34 ChangeTag::Equal => S { added, deleted },
35 ChangeTag::Delete => S {
36 added,
37 deleted: deleted + 1,
38 },
39 ChangeTag::Insert => S {
40 added: added + 1,
41 deleted,
42 },
43 });
44 #[derive(Debug, Default, Serialize)]
45 struct S {
46 added: usize,
47 deleted: usize,
48 }
49 reporter.record_modified(name, COMPARES_NAME, s);
50 Ok(MayUnsupported::Ok(()))
51 }
52
53 fn report_added(
54 &self,
55 name: &str,
56 data: FileLeaf,
57 reporter: &JsonReport<W>,
58 ) -> Result<MayUnsupported<()>, Self::Error> {
59 if !is_text_file(&data.kind, &data.content) {
60 return Ok(MayUnsupported::Unsupported);
61 }
62 reporter.record_added(name, COMPARES_NAME, ());
63 Ok(MayUnsupported::Ok(()))
64 }
65
66 fn report_deleted(
67 &self,
68 name: &str,
69 data: FileLeaf,
70 reporter: &JsonReport<W>,
71 ) -> Result<MayUnsupported<()>, Self::Error> {
72 if !is_text_file(&data.kind, &data.content) {
73 return Ok(MayUnsupported::Unsupported);
74 }
75 reporter.record_deleted(name, COMPARES_NAME, ());
76 Ok(MayUnsupported::Ok(()))
77 }
78}