use anyhow::Result;
use clap::{Parser, Subcommand};
mod abi;
mod codegen;
mod manifest;
#[derive(Parser)]
#[command(name = "mylangiser", version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Init {
#[arg(short, long, default_value = ".")]
path: String,
},
Validate {
#[arg(short, long, default_value = "mylangiser.toml")]
manifest: String,
},
Generate {
#[arg(short, long, default_value = "mylangiser.toml")]
manifest: String,
#[arg(short, long, default_value = "generated/mylangiser")]
output: String,
},
Build {
#[arg(short, long, default_value = "mylangiser.toml")]
manifest: String,
#[arg(long)]
release: bool,
},
Run {
#[arg(short, long, default_value = "mylangiser.toml")]
manifest: String,
#[arg(trailing_var_arg = true)]
args: Vec<String>,
},
Info {
#[arg(short, long, default_value = "mylangiser.toml")]
manifest: String,
},
}
fn main() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Commands::Init { path } => {
manifest::init_manifest(&path)?;
}
Commands::Validate { manifest } => {
let m = manifest::load_manifest(&manifest)?;
manifest::validate(&m)?;
println!("Valid: {}", m.project.name);
}
Commands::Generate { manifest, output } => {
let m = manifest::load_manifest(&manifest)?;
manifest::validate(&m)?;
codegen::generate_all(&m, &output)?;
}
Commands::Build { manifest, release } => {
let m = manifest::load_manifest(&manifest)?;
codegen::build(&m, release)?;
}
Commands::Run { manifest, args } => {
let m = manifest::load_manifest(&manifest)?;
codegen::run(&m, &args)?;
}
Commands::Info { manifest } => {
let m = manifest::load_manifest(&manifest)?;
manifest::print_info(&m);
}
}
Ok(())
}