tree-type-proc-macro 0.1.1

Procedural macros for tree-type crate
Documentation
use std::path::Path;
use tree_type_proc_macro::tree_type;

// Test basic navigation
tree_type! {
    TestRoot {
        config,
        src/ {
            lib,
            main
        }
    }
}

#[test]
fn test_basic_navigation() {
    let root = TestRoot::new("/tmp/test");

    // Test root path
    assert_eq!(root.as_path(), Path::new("/tmp/test"));

    // Test file navigation
    let config = root.config();
    assert_eq!(config.as_path(), Path::new("/tmp/test/config"));

    // Test directory navigation
    let src = root.src();
    assert_eq!(src.as_path(), Path::new("/tmp/test/src"));

    // Test nested navigation
    let lib = src.lib();
    assert_eq!(lib.as_path(), Path::new("/tmp/test/src/lib"));

    let main = src.main();
    assert_eq!(main.as_path(), Path::new("/tmp/test/src/main"));
}

// Test custom filenames
tree_type! {
    CustomRoot {
        config(".config"),
        ssh/(".ssh") {
            key("id_rsa")
        }
    }
}

#[test]
fn test_custom_filenames() {
    let root = CustomRoot::new("/home/user");

    let config = root.config();
    assert_eq!(config.as_path(), Path::new("/home/user/.config"));

    let ssh = root.ssh();
    assert_eq!(ssh.as_path(), Path::new("/home/user/.ssh"));

    let key = ssh.key();
    assert_eq!(key.as_path(), Path::new("/home/user/.ssh/id_rsa"));
}

// Test custom types
tree_type! {
    TypedRoot {
        config as ConfigFile,
        data/ as DataDir {
            settings as SettingsFile
        }
    }
}

#[test]
fn test_custom_types() {
    let root = TypedRoot::new("/app");

    let config: ConfigFile = root.config();
    assert_eq!(config.as_path(), Path::new("/app/config"));

    let data: DataDir = root.data();
    assert_eq!(data.as_path(), Path::new("/app/data"));

    let settings: SettingsFile = data.settings();
    assert_eq!(settings.as_path(), Path::new("/app/data/settings"));
}

// Test nested directories (3+ levels)
tree_type! {
    DeepRoot {
        a/ {
            b/ {
                c/ {
                    d
                }
            }
        }
    }
}

#[test]
fn test_deep_nesting() {
    let root = DeepRoot::new("/deep");

    let a = root.a();
    assert_eq!(a.as_path(), Path::new("/deep/a"));

    let b = a.b();
    assert_eq!(b.as_path(), Path::new("/deep/a/b"));

    let c = b.c();
    assert_eq!(c.as_path(), Path::new("/deep/a/b/c"));

    let d = c.d();
    assert_eq!(d.as_path(), Path::new("/deep/a/b/c/d"));
}