Skip to main content

semdiff_differ_binary/
report_json.rs

1use crate::{BinaryDiff, BinaryDiffReporter};
2use semdiff_core::fs::FileLeaf;
3use semdiff_core::{DetailReporter, MayUnsupported};
4use semdiff_output::json::JsonReport;
5use serde::Serialize;
6use std::convert;
7
8const COMPARES_NAME: &str = "binary";
9
10impl<W> DetailReporter<BinaryDiff, FileLeaf, JsonReport<W>> for BinaryDiffReporter {
11    type Error = convert::Infallible;
12
13    fn report_unchanged(
14        &self,
15        name: &str,
16        diff: &BinaryDiff,
17        reporter: &JsonReport<W>,
18    ) -> Result<MayUnsupported<()>, Self::Error> {
19        let report = SingleReport {
20            size: diff.expected().len(),
21        };
22        reporter.record_unchanged(name, COMPARES_NAME, report);
23        Ok(MayUnsupported::Ok(()))
24    }
25
26    fn report_modified(
27        &self,
28        name: &str,
29        diff: &BinaryDiff,
30        reporter: &JsonReport<W>,
31    ) -> Result<MayUnsupported<()>, Self::Error> {
32        let stat = BinaryDiff::stat(&diff.changes());
33        let expected_size = diff.expected.len();
34        let actual_size = diff.actual.len();
35        let report = ModifiedReport {
36            expected_size,
37            actual_size,
38            added: stat.added,
39            deleted: stat.deleted,
40        };
41        reporter.record_modified(name, COMPARES_NAME, report);
42        Ok(MayUnsupported::Ok(()))
43    }
44
45    fn report_added(
46        &self,
47        name: &str,
48        data: &FileLeaf,
49        reporter: &JsonReport<W>,
50    ) -> Result<MayUnsupported<()>, Self::Error> {
51        let report = SingleReport {
52            size: data.content.len(),
53        };
54        reporter.record_added(name, COMPARES_NAME, report);
55        Ok(MayUnsupported::Ok(()))
56    }
57
58    fn report_deleted(
59        &self,
60        name: &str,
61        data: &FileLeaf,
62        reporter: &JsonReport<W>,
63    ) -> Result<MayUnsupported<()>, Self::Error> {
64        let report = SingleReport {
65            size: data.content.len(),
66        };
67        reporter.record_deleted(name, COMPARES_NAME, report);
68        Ok(MayUnsupported::Ok(()))
69    }
70}
71
72#[derive(Serialize)]
73struct ModifiedReport {
74    expected_size: usize,
75    actual_size: usize,
76    added: usize,
77    deleted: usize,
78}
79
80#[derive(Serialize)]
81struct SingleReport {
82    size: usize,
83}