use std::path::PathBuf;
use anyhow::Result;
use clap::{Args, Parser, Subcommand};
#[path = "common/events.rs"]
mod events;
#[path = "common/input.rs"]
mod input;
#[path = "common/inspect.rs"]
mod inspect;
#[path = "common/plan.rs"]
mod plan_cmd;
#[derive(Parser, Debug)]
#[command(name = "greentic-pack", version, about = "Greentic pack utilities")]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand, Debug)]
enum Command {
Inspect(InspectArgs),
Plan(PlanArgs),
#[command(subcommand)]
Events(EventsCommand),
}
#[derive(Args, Debug)]
struct InspectArgs {
#[arg(value_name = "FILE")]
path: PathBuf,
#[arg(long, value_enum, default_value_t = inspect::PolicyArg::Devok)]
policy: inspect::PolicyArg,
#[arg(long)]
json: bool,
}
#[derive(Args, Debug)]
struct PlanArgs {
#[arg(value_name = "PATH")]
input: PathBuf,
#[arg(long, default_value = "tenant-local")]
tenant: String,
#[arg(long, default_value = "local")]
environment: String,
#[arg(long)]
json: bool,
#[arg(long)]
verbose: bool,
}
#[derive(Subcommand, Debug)]
enum EventsCommand {
List(EventsListArgs),
}
#[derive(Args, Debug)]
struct EventsListArgs {
#[arg(value_name = "PATH")]
path: PathBuf,
#[arg(long, value_enum, default_value_t = events::OutputFormat::Table)]
format: events::OutputFormat,
#[arg(long)]
verbose: bool,
}
fn main() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Command::Inspect(args) => inspect::run(&args.path, args.policy, args.json),
Command::Plan(args) => plan_cmd::run(&args),
Command::Events(cmd) => match cmd {
EventsCommand::List(args) => events::list(&args),
},
}
}