use std::{fs, process::Command};
use anyhow::anyhow;
use camino::{Utf8Path, Utf8PathBuf};
use clap::{Parser, Subcommand, ValueEnum};
use compiler_core::{
db::{
build_options::{BuildOptions, EmitOption},
Db,
},
target::TargetPlatform,
};
use compiler_mir::Mir;
use execute::Execute;
fn main() -> anyhow::Result<()> {
color_eyre::install().map_err(|r| anyhow!("{r}"))?;
let cli = Cli::parse();
let target_platform =
TargetPlatform::current().map_err(|os| anyhow!("{os} is not supported"))?;
let build_options = BuildOptions::new(
cli.timings,
cli.emit.into_iter().map(Into::into).collect(),
cli.output_dir,
target_platform,
);
let mut db = Db::new(build_options);
match cli.cmd {
Commands::Build { file } => {
build(&mut db, &file)?;
}
Commands::Run { file } => {
if let Some(exe) = build(&mut db, &file)? {
let _ = Command::new(exe).execute_output();
}
}
Commands::Check { file } => {
check(&mut db, &file)?;
}
}
db.print_timings();
db.print_diagnostics();
Ok(())
}
fn build(db: &mut Db, root_file: &Utf8Path) -> anyhow::Result