cargo-ff 1.0.0

Fast Format drop-in replacement for cargo-fmt
Documentation
use crate::types::{BatchResult, FileFailure, Report};
use crossbeam_channel::Receiver;
use std::io::Write;

pub(crate) fn aggregate(rx: Receiver<BatchResult>) -> Report {
    let mut results: Vec<BatchResult> = rx.into_iter().collect();
    results.sort_by(|a, b| a.sort_key.cmp(&b.sort_key));

    let mut failures = Vec::new();
    let mut exit_code = 0;

    let stdout = std::io::stdout();
    let stderr = std::io::stderr();
    let mut out = stdout.lock();
    let mut err = stderr.lock();

    for r in &results {
        let _ = out.write_all(&r.stdout);
        let _ = err.write_all(&r.stderr);
        if r.exit_code != 0 {
            exit_code = 1;
            for (file, manifest_dir) in &r.files {
                failures.push(FileFailure {
                    file: file.clone(),
                    manifest_dir: manifest_dir.clone(),
                });
            }
        }
    }

    Report {
        failures,
        exit_code,
    }
}