1pub mod application;
2pub mod command;
3pub mod component;
4pub mod signal;
5pub mod version;
6pub mod component_factory;
7
8pub use {anyhow, async_trait, config, vergen_pretty, clap};
9
10#[macro_export]
11macro_rules! new_app {
12 (@common) => {
13 let printer = || {
14 use $crate::vergen_pretty::{header, vergen_pretty_env, ConfigBuilder};
15
16 let config = ConfigBuilder::default()
17 .env(vergen_pretty_env!())
18 .build()
19 .unwrap_or_else(|e| {
20 eprintln!("Failed to build version config: {}", e);
21 std::process::exit(1);
22 });
23
24 let mut writer = std::io::stdout();
25 header(&config, Some(&mut writer))
26 .unwrap_or_else(|e| {
27 eprintln!("Failed to print version info: {}", e);
28 std::process::exit(1);
29 });
30 };
31
32 if let Err(_) = $crate::version::GLOBAL_VERSION_PRINTER.set(printer) {
33 eprintln!("Error: Version printer already initialized!");
34 eprintln!("Ensure you only call new_app!() once.");
35 std::process::exit(1);
36 }
37 };
38
39 () => {
41 {
42 $crate::new_app!(@common);
43 $crate::application::App::with_empty_command()
44 }
45 };
46
47 ($Command:ty) => {
49 {
50 $crate::new_app!(@common);
51 $crate::application::App::<$Command>::new()
52 }
53 };
54}