Tired of writing and updating all the mod statements in mod.rs?
Generate them with dirmod instead.
dirmod scans your directory and generates the corresponding mod statements automatically
with a simple macro call:
rust
dirmod::all!();
And that's all!
(Note:
dirmodis designed for Rust 2018 Edition, so macros take simple and ambiguous names likeall,os, etc. It is recommended to call the macros in fully-qualified fashion likedirmod::all!,dirmod::os!(), etc. for clarity. The old#[macro_use] extern crate dirmod;style is not recommended.)
Modules can be set to a common visibility,
so all modules can be pub mod or pub(self) mod, etc. by default at your favour:
rust
dirmod::all!(default pub);
You can also make all modules private, and set the visibility for the re-exported items instead.
If there are individual modules among dozens that need special visibility configuration, it is also possible to write
rust
dirmod::all!(default pub; priv foo, bar);
Then all modules have pub visibility,
except foo and bar which are private.
But I use
modto implement conditional compilation!
No problem, dirmod generates cfg attributes for some idiomatic styles:
- A directory where each module name is the feature name (e.g. #[cfg(feature = "foo")] mod foo;)
- A directory where each module name is the OS/OS family name (e.g. #[cfg(target_family = "unix")] mod unix;)
This can be achieved by calling dirmod::os!(), dirmod::family!() or dirmod::feature!().
It is likely that different OS variants of the same module expose the same API, so it might be practical to write:
rust
dirmod::os!(pub use);
If none of the modules support the current OS, you could trigger a compile error:
rust
dirmod::os!(pub use ||);
Or with a custom error message:
rust
dirmod::os!(pub use || "custom error message");
Note that it does not make sense to use the || on dirmod::feature!,
because Cargo features are incremental and should not be restricted in amount.
File an issue if I missed any common styles!
No problem, you don't have to use dirmod for every module.
dirmod::all!() has an except argument that excludes certain modules.
Since the macro simply generates mod statements,
it is perfectly fine to add more items before/after the macro call.
rust
dirmod::all!(except corge, grault);
Instead of writing docs in mod.rs, write them in the module directly.
In addition to dirmod constraints, there are a few advantages:
To write docs for the module, use this syntax at the top of the module (before any other items):
rust
//! Yay, I'm now describing myself!
//! I finally have my own place!
Since detecting the source file requires the proc_macro_span feature,
Rust Nightly is required to compile this crate.
See the testcrate directory, which demonstrates the use of dirmod::all! and dirmod::family!.