Skip to main content

baizekit_app/
lib.rs

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    // 模式1:无参数,返回空命令App
40    () => {
41        {
42            $crate::new_app!(@common);
43            $crate::application::App::with_empty_command()
44        }
45    };
46
47    // 模式2:有参数,返回命令App
48    ($Command:ty) => {
49        {
50            $crate::new_app!(@common);
51            $crate::application::App::<$Command>::new()
52        }
53    };
54}