treestat 1.1.0

A CLI that displays source file counts in a tree view by directory and language
Documentation
use std::collections::{BTreeSet, HashMap};
use std::path::PathBuf;

use treestat::cli::HeaderMode;
use treestat::lang::{apply_header_mode, build_extensions, canonical_language_name};
use treestat::model::DirData;
use treestat::scanner::compute_tree_counts;

#[test]
fn header_modes_work() {
    let mut set = ["c", "cpp", "h", "hpp"]
        .into_iter()
        .map(str::to_string)
        .collect();
    apply_header_mode(&mut set, HeaderMode::Exclude);
    assert!(set.contains("cpp"));
    assert!(!set.contains("h"));

    let mut set = ["c", "cpp", "h", "hpp"]
        .into_iter()
        .map(str::to_string)
        .collect();
    apply_header_mode(&mut set, HeaderMode::Only);
    assert!(!set.contains("c"));
    assert!(set.contains("hpp"));
}

#[test]
fn aggregate_counts() {
    let root = PathBuf::from("/tmp/root");
    let child = PathBuf::from("/tmp/root/src");
    let mut dirs = HashMap::new();
    dirs.insert(
        root.clone(),
        DirData {
            name: "root".to_string(),
            children: [child.clone()].into_iter().collect(),
            direct_files: 1,
        },
    );
    dirs.insert(
        child.clone(),
        DirData {
            name: "src".to_string(),
            children: BTreeSet::new(),
            direct_files: 2,
        },
    );

    let counts = compute_tree_counts(&root, &dirs);
    assert_eq!(counts.get(&root), Some(&3));
    assert_eq!(counts.get(&child), Some(&2));
}

#[test]
fn linguist_alias_and_multi_lang_extensions() {
    assert_eq!(canonical_language_name("cpp").as_deref(), Some("c++"));

    let exts = build_extensions(
        &["c".to_string(), "cpp".to_string()],
        &[],
        HeaderMode::Include,
    )
    .expect("language aliases should resolve");
    assert!(exts.contains("c"));
    assert!(exts.contains("cpp"));
    assert!(exts.contains("cc"));
    assert!(exts.contains("h"));
    assert!(exts.contains("hpp"));
}