mago_cli/
lib.rs

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    // Set up the logger.
18    initialize_logger(if cfg!(debug_assertions) { LevelFilter::DEBUG } else { LevelFilter::INFO }, "MAGO_LOG");
19
20    // Load the configuration.
21    let configuration = Configuration::load().unwrap_or_else(bail);
22
23    // Create the runtime.
24
25    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}