mod commands;
mod compiler;
mod config;
use std::path::PathBuf;
use anyhow::{Context as _, Error};
use clap::{ArgAction, Parser, Subcommand};
use tracing_subscriber::EnvFilter;
#[derive(Parser, Debug)]
#[command(author, version, about)]
struct Cli {
#[arg(short, long, value_name = "FILE", env = "SIGMD_CONFIG")]
config: PathBuf,
#[arg(short, long, action = ArgAction::Count, group = "logging")]
verbose: u8,
#[arg(short, long, group = "logging")]
quiet: bool,
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand, Debug)]
enum Command {
Build(commands::build::BuildArgs),
Compile(commands::compile::CompileArgs),
}
pub fn run() -> Result<(), Error> {
let cli = Cli::parse();
let default_level = match (cli.verbose, cli.quiet) {
(_, true) => "error",
(0, _) | (1, _) => "info",
(2, _) => "debug",
_ => "trace",
};
let filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(default_level));
tracing_subscriber::fmt()
.with_writer(std::io::stderr)
.with_env_filter(filter)
.with_target(false)
.init();
let config = config::load(&cli.config)
.with_context(|| format!("loading config: {}", cli.config.display()))?;
match cli.command {
Command::Build(args) => commands::build::run(config, args),
Command::Compile(args) => commands::compile::run(config, args),
}
}