Skip to main content

annotate_build/
lib.rs

1use std::path::PathBuf;
2
3pub use config::{
4    BuildConfig, ConfigSpec, FunctionSpec, ModuleDeriveBuilder, ModuleDeriveSpec, ModuleSpec,
5};
6
7pub(crate) use function::*;
8pub(crate) use module::*;
9pub(crate) use path::*;
10pub(crate) use render::*;
11
12mod builder;
13mod config;
14mod environment;
15mod function;
16mod module;
17mod parser;
18mod path;
19mod render;
20mod visitor;
21
22/// Scan the current crate for `#[pragma(...)]` annotations and export the generated environment.
23pub fn build() {
24    build_with(|_| {});
25}
26
27/// Scan the current crate and export the generated environment from multiple configuration specs.
28pub fn build_with_specs<'a>(specs: impl IntoIterator<Item = &'a ConfigSpec>) {
29    let mut config = BuildConfig::default();
30
31    for spec in specs {
32        config.merge(BuildConfig::from_spec(spec));
33    }
34
35    build_from_config(config);
36}
37
38/// Scan the current crate and export the generated environment using a small configuration DSL.
39pub fn build_with(configure: impl FnOnce(&mut BuildConfig)) {
40    let mut config = BuildConfig::default();
41    configure(&mut config);
42
43    build_from_config(config);
44}
45
46fn build_from_config(config: BuildConfig) {
47    let manifest_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
48
49    builder::build_manifest(
50        config.pragmas,
51        &config.derives,
52        config.module_derives,
53        manifest_dir.join("Cargo.toml"),
54        manifest_dir.file_name().unwrap(),
55    )
56}