1use std::process::exit;
2
3use clap::Parser;
4use tokio::runtime::Builder;
5
6use mago_feedback::initialize_logger;
7use mago_feedback::LevelFilter;
8use mago_service::config::Configuration;
9
10use crate::commands::MagoCommand;
11use crate::utils::bail;
12
13pub mod commands;
14pub mod utils;
15
16pub fn run() -> ! {
17 initialize_logger(if cfg!(debug_assertions) { LevelFilter::DEBUG } else { LevelFilter::INFO }, "MAGO_LOG");
19
20 let configuration = Configuration::load().unwrap_or_else(bail);
22
23 let runtime = if configuration.threads <= 1 {
26 Builder::new_current_thread().enable_all().build().unwrap_or_else(bail)
27 } else {
28 Builder::new_multi_thread()
29 .worker_threads(configuration.threads)
30 .thread_stack_size(configuration.stack_size)
31 .enable_all()
32 .build()
33 .unwrap_or_else(bail)
34 };
35
36 let code = match MagoCommand::parse() {
37 MagoCommand::Lint(cmd) => runtime.block_on(commands::lint::execute(cmd, configuration)),
38 MagoCommand::Fix(cmd) => runtime.block_on(commands::fix::execute(cmd, configuration)),
39 MagoCommand::Format(cmd) => runtime.block_on(commands::format::execute(cmd, configuration)),
40 MagoCommand::Ast(cmd) => runtime.block_on(commands::ast::execute(cmd)),
41 };
42
43 exit(code)
44}