arduino_report_size_deltas/summarize/
mod.rs

1//! A module to define functions that generate a markdown comment.
2mod helpers;
3use std::path::Path;
4mod structs;
5use crate::{CommentAssemblyError, reports::parse_artifacts};
6pub use helpers::COMMENT_MARKER;
7use helpers::{generate_detailed_table, generate_general_table};
8
9/// Generate the comment to be posted for a PR.
10///
11/// The given `sketches_path` shall point to the directory containing JSON files.
12/// The comment is generated from the parsed JSON data.
13///
14/// When successful, this returns a [`String`] in markdown syntax.
15pub fn generate_comment<P: AsRef<Path>>(sketches_path: P) -> Result<String, CommentAssemblyError> {
16    let mut reports = parse_artifacts(&sketches_path)?;
17    if reports.is_empty() {
18        log::error!(
19            "No delta size data found in the PR's artifacts (in path {}). \
20            Ensure the `enable-size-deltas-report` input for `arduino/compile-sketches` action is enabled.",
21            sketches_path.as_ref().to_string_lossy()
22        );
23        return Err(CommentAssemblyError::NotFound);
24    }
25    reports.sort_by_key(|k| k.boards[0].board.clone());
26
27    let mut comment = String::from(COMMENT_MARKER);
28    comment.push_str(format!("### Memory usage change @ {}\n\n", reports[0].commit_hash).as_str());
29
30    generate_general_table(&reports, &mut comment);
31    generate_detailed_table(&reports, &mut comment);
32
33    Ok(comment)
34}
35
36#[cfg(test)]
37mod test {
38    use super::{CommentAssemblyError, generate_comment};
39    use std::fs;
40
41    #[test]
42    fn use_new_test_assets() {
43        let comment = generate_comment("tests/size-deltas-reports-new").unwrap();
44        fs::write("tests/size-deltas-reports-new/out.md", comment).unwrap();
45    }
46
47    #[test]
48    fn use_old_test_assets() {
49        assert!(matches!(
50            generate_comment("tests/size-deltas-reports-old"),
51            Err(CommentAssemblyError::NotFound)
52        ));
53    }
54
55    #[test]
56    fn use_actual_assets() {
57        let comment = generate_comment("tests/test_assets").unwrap();
58        fs::write("tests/test_assets/out.md", comment).unwrap();
59    }
60}