Skip to main content

semdiff_differ_text/
report_json.rs

1use 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}