sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
use super::Entry;
use crate::benchmark::engine::CSV_HEADER;
use std::collections::BTreeMap;
use std::fs;
use std::path::Path;

pub(super) fn build_csv(
    entries: &[Entry<'_>],
    tag_keys: &[&str],
    dir: &Path,
) -> std::io::Result<(BTreeMap<String, String>, usize)> {
    let csv_dir = dir.join("csv");
    fs::create_dir_all(&csv_dir)?;
    let mut files_written = 0usize;
    let mut csv_files: BTreeMap<String, String> = BTreeMap::new();

    let mut csv_all = String::from(CSV_HEADER);
    for k in tag_keys {
        csv_all.push(',');
        csv_all.push_str(k);
    }
    csv_all.push('\n');

    let mut group_csv: BTreeMap<String, String> = BTreeMap::new();

    for entry in entries {
        let m = entry.metrics;
        csv_all.push_str(&m.to_csv_row());
        csv_all.push(',');
        csv_all.push_str(entry.result);
        for (_, v) in &entry.tags {
            csv_all.push(',');
            csv_all.push_str(v);
        }
        csv_all.push('\n');

        if let Some(group_tag) = entry.tags.first() {
            let key = group_tag.1.replace(' ', "_");
            let bucket = group_csv.entry(key.clone()).or_insert_with(|| {
                let mut h = String::from(CSV_HEADER);
                for k in tag_keys {
                    h.push(',');
                    h.push_str(k);
                }
                h.push('\n');
                h
            });
            bucket.push_str(&m.to_csv_row());
            bucket.push(',');
            bucket.push_str(entry.result);
            for (_, v) in &entry.tags {
                bucket.push(',');
                bucket.push_str(v);
            }
            bucket.push('\n');
        }
    }

    csv_files.insert("all.csv".into(), csv_all.clone());
    fs::write(csv_dir.join("all.csv"), &csv_all)?;
    files_written += 1;

    for (group, content) in &group_csv {
        let fname = format!("{group}.csv");
        csv_files.insert(fname.clone(), content.clone());
        fs::write(csv_dir.join(&fname), content)?;
        files_written += 1;
    }

    Ok((csv_files, files_written))
}