winbrew/
main.rs

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}