zoisite 0.1.0

Zoisite is a programming language designed specifically for competitive programming.
Documentation
use clap::{Parser, ValueEnum};
use std::process::exit;
use std::{fs, path::Path};
use zoisite::{run_lifecycle, LifecycleOptions};

#[derive(Debug, Clone, ValueEnum, PartialEq)]
enum EmitFormat {
    Syntax,
    Ir,
    Submission,
    Executable,
}

#[derive(Parser, Debug)]
#[command(name = "Zoisite")]
#[clap(author, version, about)]
struct Args {
    #[clap(help = "Path to the Zoisite source file")]
    input: String,

    #[clap(
        long,
        value_enum,
        value_delimiter = ',',
        default_values_t = [EmitFormat::Ir, EmitFormat::Submission, EmitFormat::Executable],
        help = "Comma-separated list of output formats: syntaxx, ir, submission, executable",
        hide_default_value = true,
        hide_possible_values = true,
    )]
    emit: Vec<EmitFormat>,

    #[clap(short = 'O', long = "optimize", help = "Enable optimizations")]
    optimize: bool,

    #[clap(short = 'd', long = "debug", help = "Enable debug information")]
    debug: bool,

    #[clap(long, help = "Additional arguments to pass to clang")]
    clang_args: Option<String>,
}

fn main() {
    let args = Args::parse();

    let base_name = Path::new(&args.input)
        .file_stem()
        .and_then(|s| s.to_str())
        .unwrap_or("output")
        .to_string();

    let source = fs::read_to_string(&args.input)
        .expect("Failed to read source file");

    let clang_args_vec: Vec<String> = args.clang_args
        .iter()
        .flat_map(|s| s.split_whitespace())
        .map(String::from)
        .collect();

    let opts = LifecycleOptions {
        base_name,
        debug: args.debug,
        optimize: args.optimize,
        run_jit: false,
        output_syntax: args.emit.contains(&EmitFormat::Syntax),
        output_ir: args.emit.contains(&EmitFormat::Ir),
        output_submission: args.emit.contains(&EmitFormat::Submission),
        output_executable: args.emit.contains(&EmitFormat::Executable),
        clang_args: clang_args_vec,
    };

    if !run_lifecycle(&source, opts) {
        eprintln!("Compilation failed");
        exit(1);
    }
}