plzplz 0.0.19

A simple cross-platform task runner with helpful defaults
Documentation
use super::{CheckResult, FileEntry, Finding};
use anyhow::Result;
use std::collections::HashMap;

pub const NAME: &str = "case-conflict";

pub fn run(files: &[FileEntry]) -> Result<CheckResult> {
    let mut findings = Vec::new();

    let mut by_lower: HashMap<String, Vec<String>> = HashMap::new();
    for file in files {
        by_lower
            .entry(file.path.to_lowercase())
            .or_default()
            .push(file.path.clone());
    }

    let mut conflicts: Vec<_> = by_lower.into_iter().filter(|(_, v)| v.len() > 1).collect();
    conflicts.sort_by(|a, b| a.0.cmp(&b.0));

    for (_, group) in conflicts {
        for file in &group {
            let others: Vec<&str> = group
                .iter()
                .filter(|f| *f != file)
                .map(|f| f.as_str())
                .collect();
            findings.push(Finding {
                file: file.clone(),
                detail: format!("conflicts with {}", others.join(", ")),
            });
        }
    }

    Ok(CheckResult {
        name: NAME,
        description: "Check case conflicts",
        passed: findings.is_empty(),
        findings,
    })
}