use-dir 0.0.1

Practical directory path utility primitives
Documentation
use use_dir::{
    dir_name, ensure_dir_trailing_separator, is_current_dir, is_parent_dir, is_root_dir,
    normalize_dir_path, path_depth, relative_to_dir, starts_with_dir, strip_dir_trailing_separator,
};

#[test]
fn extracts_directory_names() {
    assert_eq!(dir_name("docs/guides/intro.md").as_deref(), Some("guides"));
    assert_eq!(dir_name("docs/guides/").as_deref(), Some("guides"));
    assert_eq!(dir_name("docs").as_deref(), Some("docs"));
    assert_eq!(dir_name("/"), None);
}

#[test]
fn detects_root_current_and_parent_dirs() {
    assert!(is_root_dir("/"));
    assert!(is_root_dir(r"C:\"));
    assert!(is_root_dir(r"\\server\share"));
    assert!(is_current_dir("."));
    assert!(is_current_dir("./"));
    assert!(is_parent_dir(".."));
    assert!(is_parent_dir("../"));
}

#[test]
fn normalizes_and_adjusts_trailing_separators() {
    assert_eq!(normalize_dir_path(r"docs\guides\"), "docs/guides");
    assert_eq!(normalize_dir_path("/"), "/");
    assert_eq!(ensure_dir_trailing_separator("docs"), "docs/");
    assert_eq!(
        ensure_dir_trailing_separator(r"docs\guides"),
        "docs/guides/"
    );
    assert_eq!(strip_dir_trailing_separator("docs/guides/"), "docs/guides");
}

#[test]
fn calculates_path_depth() {
    assert_eq!(path_depth("docs/guides"), 2);
    assert_eq!(path_depth("docs/guides/getting-started"), 3);
    assert_eq!(path_depth("/"), 0);
    assert_eq!(path_depth(r"C:\Users\Joshua"), 2);
    assert_eq!(path_depth(r"\\server\share\folder"), 1);
}

#[test]
fn checks_directory_prefixes() {
    assert!(starts_with_dir("docs/guides/intro.md", "docs"));
    assert!(starts_with_dir("/tmp/logs/app.log", "/tmp"));
    assert!(!starts_with_dir("docs2/intro.md", "docs"));
    assert!(!starts_with_dir("docs/guides", "/tmp"));
}

#[test]
fn computes_relative_paths() {
    assert_eq!(
        relative_to_dir("docs/guides/intro.md", "docs").as_deref(),
        Some("guides/intro.md")
    );
    assert_eq!(relative_to_dir("docs", "docs").as_deref(), Some("."));
    assert_eq!(
        relative_to_dir("/tmp/logs/app.log", "/tmp").as_deref(),
        Some("logs/app.log")
    );
    assert_eq!(relative_to_dir("docs/guides", "other"), None);
}

#[test]
fn handles_empty_input() {
    assert_eq!(dir_name(""), None);
    assert_eq!(normalize_dir_path(""), "");
    assert_eq!(relative_to_dir("", ""), None);
}