github_actions/
summary.rs

1use std::env;
2use std::fs::{File, OpenOptions};
3use std::io::{self, Write};
4use std::path::Path;
5
6#[derive(Debug)]
7pub enum SummaryError {
8    VarError(env::VarError),
9    FileError(io::Error),
10}
11
12fn clean_markdown_string(markdown_text: &str) -> String {
13    markdown_text
14        .replace("%25", "%")
15        .replace("%0D", "\r")
16        .replace("%0A", "\n")
17        .to_string()
18}
19
20pub fn append_job_summary(markdown_text: &str) -> Result<(), SummaryError> {
21    let summary_path = env::var(crate::GITHUB_STEP_SUMMARY).map_err(SummaryError::VarError)?;
22    let mut file = OpenOptions::new()
23        .append(true)
24        .open(summary_path)
25        .map_err(SummaryError::FileError)?;
26    writeln!(file, "{}", clean_markdown_string(markdown_text)).map_err(SummaryError::FileError)?;
27    Ok(())
28}
29
30pub fn overwrite_job_summary(markdown_text: &str) -> Result<(), SummaryError> {
31    let summary_path = env::var(crate::GITHUB_STEP_SUMMARY).map_err(SummaryError::VarError)?;
32    let mut file = File::create(summary_path).map_err(SummaryError::FileError)?;
33    writeln!(file, "{}", clean_markdown_string(markdown_text)).map_err(SummaryError::FileError)?;
34    Ok(())
35}
36
37pub fn remove_job_summary() -> io::Result<()> {
38    if let Ok(summary_path) = env::var(crate::GITHUB_STEP_SUMMARY) {
39        let path = Path::new(&summary_path);
40        if path.exists() {
41            std::fs::remove_file(path)?;
42        }
43    }
44    Ok(())
45}