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}