1#[cfg(windows)]
2use clap::Parser;
3
4#[cfg(windows)]
5use mimalloc::MiMalloc;
6
7#[cfg(windows)]
8use std::error::Error as _;
9
10#[cfg(windows)]
11#[global_allocator]
12static GLOBAL: MiMalloc = MiMalloc;
13
14#[cfg(windows)]
15fn main() -> std::process::ExitCode {
16 let cli = winbrew_cli::cli::Cli::parse();
17 let verbose = cli.verbose;
18 let command = cli.command;
19
20 if let Err(err) = winbrew_cli::run_app(command, verbose) {
21 if let Some(cmd_err) = err.downcast_ref::<winbrew_cli::commands::error::CommandError>() {
22 if let winbrew_cli::commands::error::CommandError::Fatal(message) = cmd_err {
23 eprintln!("\nFATAL: {message}");
24 }
25
26 if cli.verbose > 0 {
27 print_command_error_sources(cmd_err);
28 }
29
30 return std::process::ExitCode::from(cmd_err);
31 }
32
33 eprintln!("\nUNEXPECTED: {err:#}");
34 return std::process::ExitCode::from(1);
35 }
36
37 std::process::ExitCode::SUCCESS
38}
39
40#[cfg(windows)]
41fn print_command_error_sources(err: &winbrew_cli::commands::error::CommandError) {
42 let Some(mut source) = err.source() else {
43 return;
44 };
45
46 eprintln!("Caused by:");
47 loop {
48 eprintln!(" - {source}");
49
50 match source.source() {
51 Some(next) => source = next,
52 None => break,
53 }
54 }
55}