crax 0.1.8

An interesting CLI for frontend programmer
Documentation
use std::path::{Path, PathBuf};

use clap::Args;
use crax_dts::dts::new_builder;

#[derive(Args)]
pub struct Cmd {
    #[arg(long, help = "Current program like: tsc")]
    program: Option<String>,
    #[arg(short, long, help = "Typescript config preset")]
    preset: Option<String>,
    #[arg(short, long, help = "Output")]
    output: Option<PathBuf>,
    #[arg(short, long, default_value_t = false, help = "Debugger")]
    debugger: bool,
    #[arg(short, long, default_value_t = false, help = "See log file")]
    log_file: bool,
    #[arg(long, help = "Pre build task")]
    pre_build_task: Option<String>,
    #[arg(long, allow_hyphen_values = true, num_args = 0..)]
    args: Option<Vec<String>>,
}

pub async fn run(option: &Cmd, cur: impl AsRef<Path>) -> anyhow::Result<()> {
    let mut builder = new_builder(&cur);

    if let Some(ref output) = option.output {
        builder.output(output.clone());
    }

    if let Some(args) = &option.args {
        builder.other_args(args.clone());
    } else {
        builder.other_args([]);
    }

    builder.log_file(option.log_file);
    builder.debugger(option.debugger);

    // TODO why?
    if let Some(parser) = builder.parser.as_mut() {
        if let Some(ref n) = option.preset {
            parser.set_config(n);
        }

        if let Some(ref p) = option.program {
            parser.set_program(p);
        }
    }

    let dts = builder.build()?;

    dts.exec(true, false).await?;

    Ok(())
}