use anyhow::Result;
use clap::{Parser, Subcommand};
mod abi;
mod codegen;
mod manifest;
#[derive(Parser)]
#[command(name = "eclexiaiser", 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 = "eclexiaiser.toml")]
manifest: String,
},
Generate {
#[arg(short, long, default_value = "eclexiaiser.toml")]
manifest: String,
#[arg(short, long, default_value = "generated/eclexiaiser")]
output: String,
},
Report {
#[arg(short, long, default_value = "eclexiaiser.toml")]
manifest: String,
#[arg(short, long, default_value = "0.75")]
usage: f64,
#[arg(short, long, default_value = "sustainability_report")]
output: String,
},
Build {
#[arg(short, long, default_value = "eclexiaiser.toml")]
manifest: String,
#[arg(long)]
release: bool,
},
Run {
#[arg(short, long, default_value = "eclexiaiser.toml")]
manifest: String,
#[arg(trailing_var_arg = true)]
args: Vec<String>,
},
Info {
#[arg(short, long, default_value = "eclexiaiser.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: {} ({} function(s))",
m.project.name,
m.functions.len()
);
}
Commands::Generate { manifest, output } => {
let m = manifest::load_manifest(&manifest)?;
manifest::validate(&m)?;
codegen::generate_all(&m, &output)?;
}
Commands::Report {
manifest,
usage,
output,
} => {
let m = manifest::load_manifest(&manifest)?;
manifest::validate(&m)?;
let report = codegen::generate_report_from_simulated(&m, usage)?;
codegen::reporter::write_report(&report, &m.report, &output)?;
println!(
"Report generated: {}.* (compliance: {})",
output,
if report.all_compliant { "PASS" } else { "FAIL" }
);
}
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(())
}