1 个不稳定版本

0.1.0 2019 年 4 月 18 日

#45 in #file-storage


用于 directree

无许可证

7KB
126 代码行

directree

在编译时表达目录树的宏。


示例

可以使用 directree 宏以这种方式表达文件层次结构

use directree::directree;

mod paths {
    directree! {
        foo: "dir" {
            bar: "file.toml",

            // Note that an empty {} is allowed, but does nothing other than
            // visually distinguish whether it's supposed to be a file or a
            // directory.
            baz: "subdir" {},
        }
    }
}

directree 将这种 DSL 转换为具有相同层次结构的模块和函数序列

mod paths {
    fn foo() -> &'static std::path::Path {
        std::path::Path::new("dir")
    }
    mod foo {
        fn bar() -> &'static std::path::Path {
            std::path::Path::new("dir/file.toml")
        }
        fn baz() -> &'static std::path::Path {
            std::path::Path::new("dir/subdir")
        }
    }
}

然后可以在普通代码中用来获取指定的文件和目录

let foo_dir = std::fs::OpenOptions::new()
    .read(true)
    .open(crate::paths::foo())?;

let bar_file = std::fs::OpenOptions::new()
    .read(true)
    .open(crate::paths::foo::bar())?;

为什么?

能够在同一处指定软件需要访问的所有文件和目录非常有用。这样做为软件提供了一个关于磁盘上事物名称及其存储位置的单一事实来源。使用此项目还可以让编译器捕获模块和函数名称中的拼写错误,而不是手动验证手动编写的目录。

依赖项

~2MB
~46K SLoC