use clap::{Args, Parser, Subcommand};
use colored::{Color, Colorize};
#[cfg(feature = "json_schema")]
use commands::schema::Schema;
use commands::{effective::Effective, generate::Generate, update::Update};
use dofigen_lib::Result;
#[cfg(feature = "parse")]
use crate::commands::parse::Parse;
mod commands;
#[derive(Parser)]
#[clap(author, version, about, long_about = None, rename_all = "kebab-case")]
struct Cli {
#[clap(subcommand)]
pub command: Command,
}
#[derive(Args, Debug, Default, Clone)]
pub struct GlobalOptions {
#[clap(short, long)]
pub file: Option<String>,
#[clap(long, action)]
pub offline: bool,
}
pub trait CliCommand {
fn run(self) -> Result<()>;
}
#[derive(Subcommand, Debug, Clone)]
pub enum Command {
#[clap(alias = "gen")]
Generate(Generate),
Effective(Effective),
Update(Update),
#[cfg(feature = "json_schema")]
Schema(Schema),
#[cfg(feature = "parse")]
Parse(Parse),
}
impl Command {
fn run(self) -> Result<()> {
match self {
Command::Generate(g) => g.run(),
Command::Effective(e) => e.run(),
Command::Update(u) => u.run(),
#[cfg(feature = "json_schema")]
Command::Schema(s) => s.run(),
#[cfg(feature = "parse")]
Command::Parse(p) => p.run(),
}
}
}
fn main() {
Cli::parse().command.run().unwrap_or_else(|e| {
eprintln!("{}: {}", "error".color(Color::Red).bold(), e);
std::process::exit(1);
});
}
#[cfg(test)]
mod tests {
use super::*;
use clap::CommandFactory;
#[test]
fn verify_cmd() {
<Cli as CommandFactory>::command().debug_assert();
}
}