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
22pub fn build() {
24 build_with(|_| {});
25}
26
27pub 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
38pub 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}