patholog 1.0.0

Diagnose, explain, clean, and safely repair PATH behavior.
Documentation
use crate::model::{Diagnostic, IssueKind, PathEntry};

pub(super) fn diagnostics(entries: &[PathEntry]) -> Vec<Diagnostic> {
    let mut groups: Vec<(&str, Vec<&PathEntry>)> = Vec::new();
    for entry in entries {
        if entry.is_empty {
            continue;
        }
        if let Some((_, group_entries)) = groups
            .iter_mut()
            .find(|(key, _entries)| *key == entry.comparison_key)
        {
            group_entries.push(entry);
        } else {
            groups.push((&entry.comparison_key, vec![entry]));
        }
    }

    groups
        .into_iter()
        .filter_map(|(_key, duplicate_entries)| duplicate_diagnostic(&duplicate_entries))
        .collect()
}

fn duplicate_diagnostic(duplicate_entries: &[&PathEntry]) -> Option<Diagnostic> {
    if duplicate_entries.len() < 2 {
        return None;
    }
    let first = duplicate_entries[0];
    let related_indexes = duplicate_entries
        .iter()
        .map(|entry| entry.index)
        .collect::<Vec<_>>();
    Some(Diagnostic {
        kind: IssueKind::Duplicate,
        message: format!(
            "{} appears {} times",
            first.display,
            duplicate_entries.len()
        ),
        entry_index: Some(first.index),
        entry_value: Some(first.display.clone()),
        related_indexes,
    })
}