use std::{env, path::PathBuf, process::ExitCode};
use crate::driver::cmd::{CmdOptions, parse_arguments, print_help};
use crate::driver::compiler::{CompileOptions, compile};
use crate::utils::terminal_colors::{END, RED};
mod cmd;
mod compiler;
pub fn run() -> ExitCode {
let cmd = match parse_arguments(env::args()) {
Ok(cmd) => cmd,
Err(e) => {
eprintln!("{e}");
return ExitCode::FAILURE;
}
};
if cmd.options.contains_key(&CmdOptions::Help) {
println!("{}", print_help());
return ExitCode::SUCCESS;
}
if cmd.free_args.len() < 2 {
eprintln!("{RED}Error{END}: no input file");
return ExitCode::FAILURE;
}
if cmd.free_args.len() > 2 {
eprintln!("{RED}Error{END}: oonta only accepts a single input file");
return ExitCode::FAILURE;
}
let src_file = PathBuf::from(&cmd.free_args[1]);
let out_file = if let Some(Some(path)) = cmd.options.get(&CmdOptions::OutputPath) {
PathBuf::from(path)
} else {
src_file.with_extension("ll")
};
let mut compile_options = vec![];
if cmd.options.contains_key(&CmdOptions::TopLevel) {
compile_options.push(CompileOptions::TopLevel);
}
if cmd.options.contains_key(&CmdOptions::Optimize) {
compile_options.push(CompileOptions::OptimizeIR);
}
if cmd.options.contains_key(&CmdOptions::Compile) {
compile_options.push(CompileOptions::CreateObjFile);
}
if cmd.options.contains_key(&CmdOptions::Exec) {
compile_options.push(CompileOptions::CreateExecutable);
}
if cmd.options.contains_key(&CmdOptions::Verbose) {
compile_options.push(CompileOptions::DebugPhases);
}
match compile(&src_file, &out_file, &compile_options) {
Ok(()) => ExitCode::SUCCESS,
Err(e) => {
eprintln!("{e}");
ExitCode::FAILURE
}
}
}