use-extension 0.0.1

Practical file extension utility primitives
Documentation
use use_extension::{
    compound_extension, extension, extension_lowercase, has_extension, has_extension_eq,
    is_compound_extension, normalize_extension, with_extension, without_extension,
};

#[test]
fn extracts_extensions() {
    assert_eq!(extension("report.TXT").as_deref(), Some("TXT"));
    assert_eq!(extension("archive.tar.gz").as_deref(), Some("gz"));
    assert_eq!(extension(".gitignore"), None);
    assert_eq!(extension(".config.json").as_deref(), Some("json"));
}

#[test]
fn lowercases_and_checks_extensions() {
    assert_eq!(extension_lowercase("report.TXT").as_deref(), Some("txt"));
    assert!(has_extension("report.txt"));
    assert!(!has_extension("README"));
    assert!(has_extension_eq("report.TXT", ".txt"));
    assert!(!has_extension_eq("archive.tar.gz", "tar.gz"));
}

#[test]
fn replaces_and_removes_last_extension() {
    assert_eq!(with_extension("report.txt", "md"), "report.md");
    assert_eq!(with_extension(r"docs\report", ".md"), "docs/report.md");
    assert_eq!(with_extension("archive.tar.gz", "zip"), "archive.tar.zip");
    assert_eq!(without_extension("report.txt"), "report");
    assert_eq!(without_extension(r"docs\report.txt"), "docs/report");
    assert_eq!(without_extension("archive.tar.gz"), "archive.tar");
    assert_eq!(without_extension(".gitignore"), ".gitignore");
}

#[test]
fn normalizes_extensions() {
    assert_eq!(normalize_extension(".TXT"), "txt");
    assert_eq!(normalize_extension("..Tar.Gz"), "tar.gz");
    assert_eq!(normalize_extension(""), "");
}

#[test]
fn detects_compound_extensions() {
    assert_eq!(
        compound_extension("archive.tar.gz").as_deref(),
        Some("tar.gz")
    );
    assert_eq!(
        compound_extension("button.module.css").as_deref(),
        Some("module.css")
    );
    assert_eq!(compound_extension("types.d.ts").as_deref(), Some("d.ts"));
    assert_eq!(compound_extension("spec.ts"), None);
    assert!(is_compound_extension("archive.tar.xz"));
    assert!(!is_compound_extension("report.txt"));
}

#[test]
fn handles_empty_and_malformed_input() {
    assert_eq!(extension(""), None);
    assert_eq!(extension("docs/"), None);
    assert_eq!(without_extension("docs/"), "docs/");
    assert_eq!(with_extension("", "txt"), "");
}