1#![allow(missing_docs)]
20#![allow(
21 clippy::collapsible_else_if,
22 clippy::if_same_then_else,
23 clippy::match_like_matches_macro,
24 clippy::only_used_in_recursion
25)]
26
27pub mod adapters;
28pub mod backends;
29pub mod bin_cli;
30pub mod cli;
31pub mod codegen;
32pub mod core;
33pub mod docs;
34pub mod e2e;
35pub mod extensions;
36pub mod extract;
37pub mod publish;
38pub mod readme;
39pub mod scaffold;
40pub mod snippets;
41
42pub use core::extension::{Extension, ExtensionConfig};
43pub use core::template_env::TemplateEnv;
44pub use extensions::template::TemplateExtension;
45
46pub use core::backend::GeneratedFile;
47pub use core::config::{E2eConfig, Language, ResolvedCrateConfig};
48pub use core::ir::{ApiSurface, EnumDef, TypeDef};
49pub use e2e::fixture::{Fixture, FixtureGroup, group_fixtures, load_fixtures};
50
51pub fn run_with_extensions(mut extensions: Vec<Box<dyn Extension>>) -> std::process::ExitCode {
64 use clap::Parser;
65
66 extensions.insert(0, Box::new(TemplateExtension));
67
68 let cli = bin_cli::args::Cli::parse();
69 bin_cli::helpers::init_tracing(cli.verbose, cli.quiet, cli.no_color);
70
71 if cli.jobs > 0 {
72 rayon::ThreadPoolBuilder::new()
73 .num_threads(cli.jobs)
74 .build_global()
75 .ok();
76 }
77
78 #[cfg(feature = "dylib-loader")]
79 match extensions::dylib::load_dylib_extensions_from_config(&cli.config) {
80 Ok(mut dylib_extensions) => extensions.append(&mut dylib_extensions),
81 Err(e) => {
82 tracing::error!("{e:#}");
83 return std::process::ExitCode::FAILURE;
84 }
85 }
86
87 let _ = EXTENSIONS.set(extensions);
88
89 match bin_cli::dispatch::run(cli) {
90 Ok(()) => std::process::ExitCode::SUCCESS,
91 Err(e) => {
92 tracing::error!("{e:#}");
93 std::process::ExitCode::FAILURE
94 }
95 }
96}
97
98pub(crate) static EXTENSIONS: std::sync::OnceLock<Vec<Box<dyn Extension>>> = std::sync::OnceLock::new();
104
105pub(crate) fn with_extensions<F, R>(f: F) -> R
107where
108 F: FnOnce(&[Box<dyn Extension>]) -> R,
109{
110 static EMPTY: Vec<Box<dyn Extension>> = Vec::new();
111 f(EXTENSIONS.get().unwrap_or(&EMPTY))
112}