#![allow(missing_docs)]
pub mod adapters;
pub mod backends;
pub mod bin_cli;
pub mod cli;
pub mod codegen;
pub mod core;
pub mod docs;
pub mod e2e;
pub mod extensions;
pub mod extract;
pub mod publish;
pub mod readme;
pub mod scaffold;
pub mod snippets;
pub use core::extension::{Extension, ExtensionConfig};
pub use core::template_env::TemplateEnv;
pub use extensions::template::TemplateExtension;
pub fn run_with_extensions(mut extensions: Vec<Box<dyn Extension>>) -> std::process::ExitCode {
use clap::Parser;
extensions.insert(0, Box::new(TemplateExtension));
let cli = bin_cli::args::Cli::parse();
bin_cli::helpers::init_tracing(cli.verbose, cli.quiet, cli.no_color);
if cli.jobs > 0 {
rayon::ThreadPoolBuilder::new()
.num_threads(cli.jobs)
.build_global()
.ok();
}
EXTENSIONS.with(|cell| {
*cell.borrow_mut() = extensions;
});
match bin_cli::dispatch::run(cli) {
Ok(()) => std::process::ExitCode::SUCCESS,
Err(e) => {
eprintln!("error: {e:#}");
std::process::ExitCode::FAILURE
}
}
}
thread_local! {
pub(crate) static EXTENSIONS: std::cell::RefCell<Vec<Box<dyn Extension>>> =
const { std::cell::RefCell::new(Vec::new()) };
}
pub(crate) fn with_extensions<F, R>(f: F) -> R
where
F: FnOnce(&[Box<dyn Extension>]) -> R,
{
EXTENSIONS.with(|cell| f(&cell.borrow()))
}