use clap::{Parser, Subcommand, CommandFactory};
use std::process;
use helix::dna::{atp, bch, cmd, exp, ffi, hel, map, mds, ngs, ops, out};
#[derive(Parser)]
#[command(name = "hlx")]
#[command(version = env!("CARGO_PKG_VERSION"))]
#[command(about = "HELIX Compiler - Configuration without the pain")]
#[command(long_about = None)]
pub struct Cli {
#[arg(short, long, global = true)]
verbose: bool,
#[arg(short, long, global = true)]
quiet: bool,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Add(cmd::add::AddArgs),
Bench(cmd::bench::BenchArgs),
Bundle(cmd::bundle::BundleArgs),
Cache(cmd::cache::CacheArgs),
Clean(cmd::clean::CleanArgs),
Compile(cmd::compile::CompileArgs),
Completions(cmd::completions::CompletionsArgs),
Dataset(cmd::dataset::DatasetArgs),
Diff(cmd::diff::DiffArgs),
Doctor(cmd::doctor::DoctorArgs),
Export(cmd::export::ExportArgs),
Filter(cmd::filter::FilterArgs),
Fmt(cmd::fmt::FmtArgs),
Generate(cmd::generate::GenerateArgs),
Import(cmd::import::ImportArgs),
Info(cmd::info::InfoArgs),
Init(cmd::init::InitArgs),
Lint(cmd::lint::LintArgs),
Optimize(cmd::optimizer::OptimizeArgs),
Publish(cmd::publish::PublishArgs),
Remove(cmd::rm::RemoveArgs),
Reset(cmd::reset::ResetArgs),
Schema(cmd::schema::SchemaArgs),
Search(cmd::search::SearchArgs),
Serve(cmd::serve::ServeArgs),
Sign(cmd::sign::SignArgs),
Test(cmd::test::TestArgs),
Validate(cmd::validate::ValidateArgs),
Watch(cmd::watch::WatchArgs),
Workflow(cmd::workflow::WorkflowArgs),
}
#[tokio::main]
async fn main() {
let cli = Cli::parse();
let result = match cli.command {
Commands::Add(args) => cmd::add::run(args).await,
Commands::Bench(args) => cmd::bench::run(args),
Commands::Bundle(args) => cmd::bundle::run(args),
Commands::Cache(args) => cmd::cache::run(args),
Commands::Clean(args) => cmd::clean::run(args).await,
Commands::Compile(args) => cmd::compile::run(args),
Commands::Completions(args) => cmd::completions::run(args),
Commands::Dataset(args) => cmd::dataset::run(args).await,
Commands::Diff(args) => cmd::diff::run(args),
Commands::Doctor(args) => cmd::doctor::run(args),
Commands::Export(args) => cmd::export::run(args),
Commands::Filter(args) => cmd::filter::run(args).await,
Commands::Fmt(args) => cmd::fmt::run(args),
Commands::Generate(args) => cmd::generate::run(args),
Commands::Import(args) => cmd::import::run(args).await,
Commands::Info(args) => cmd::info::run(args),
Commands::Init(args) => cmd::init::run(cmd::init::InitInstallArgs::Init(args)),
Commands::Lint(args) => cmd::lint::run(args).await,
Commands::Optimize(args) => cmd::optimizer::run(args),
Commands::Publish(args) => cmd::publish::run(args),
Commands::Remove(args) => cmd::rm::run(args).await,
Commands::Reset(args) => cmd::reset::run(args).await,
Commands::Schema(args) => cmd::schema::run(args),
Commands::Search(args) => cmd::search::run(args),
Commands::Serve(args) => cmd::serve::run(args),
Commands::Sign(args) => cmd::sign::run(args),
Commands::Test(args) => cmd::test::run(args).await,
Commands::Validate(args) => cmd::validate::run(args),
Commands::Watch(args) => cmd::watch::run(args),
Commands::Workflow(args) => cmd::workflow::run(args),
};
if let Err(e) = result {
eprintln!("Error: {}", e);
process::exit(1);
}
}