Skip to main content

clankers_data/
compare.rs

1use clankers_core::RobotResult;
2
3use crate::inspect::{inspect_file, InspectReport};
4
5#[derive(Debug, Clone)]
6pub struct CompareReport {
7    pub expected: InspectReport,
8    pub actual: InspectReport,
9    pub topic_diffs: Vec<TopicDiff>,
10}
11
12#[derive(Debug, Clone)]
13pub struct TopicDiff {
14    pub topic: String,
15    pub expected_count: u64,
16    pub actual_count: u64,
17    pub count_match: bool,
18}
19
20pub fn compare_logs(expected: &str, actual: &str) -> RobotResult<CompareReport> {
21    let expected_report = inspect_file(std::path::Path::new(expected))?;
22    let actual_report = inspect_file(std::path::Path::new(actual))?;
23
24    let all_topics: std::collections::BTreeSet<String> = expected_report
25        .topics
26        .iter()
27        .map(|t| t.name.clone())
28        .chain(actual_report.topics.iter().map(|t| t.name.clone()))
29        .collect();
30
31    let expected_map: std::collections::HashMap<_, _> = expected_report
32        .topics
33        .iter()
34        .map(|t| (t.name.clone(), t.message_count))
35        .collect();
36    let actual_map: std::collections::HashMap<_, _> = actual_report
37        .topics
38        .iter()
39        .map(|t| (t.name.clone(), t.message_count))
40        .collect();
41
42    let topic_diffs: Vec<TopicDiff> = all_topics
43        .into_iter()
44        .map(|topic| {
45            let expected_count = expected_map.get(&topic).copied().unwrap_or(0);
46            let actual_count = actual_map.get(&topic).copied().unwrap_or(0);
47            TopicDiff {
48                count_match: expected_count == actual_count,
49                topic,
50                expected_count,
51                actual_count,
52            }
53        })
54        .collect();
55
56    Ok(CompareReport {
57        expected: expected_report,
58        actual: actual_report,
59        topic_diffs,
60    })
61}
62
63pub fn format_compare_report(report: &CompareReport) -> String {
64    let mut out = format!(
65        "Compare:\n  expected: {}\n  actual: {}\n\nTopic diffs:\n",
66        report.expected.path, report.actual.path
67    );
68    for diff in &report.topic_diffs {
69        let status = if diff.count_match { "ok" } else { "MISMATCH" };
70        out.push_str(&format!(
71            "  {} {} expected={} actual={}\n",
72            status, diff.topic, diff.expected_count, diff.actual_count
73        ));
74    }
75    out
76}