use clap::{ArgAction, Parser, Subcommand};
use std::path::PathBuf;
use crate::utils::MEKA_FILE;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None,
subcommand_required = true,
arg_required_else_help = true,
)]
pub struct MekaArgs {
#[arg(short = 'd', visible_short_alias='v', action = ArgAction::Count)]
pub debug: u8,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
#[command(visible_alias = "run")]
Record(RunArgs),
#[command(visible_alias = "analyse")]
Analyze(AnalyzeArgs),
}
#[derive(Debug, Parser)]
pub struct RunArgs {
#[arg(global = true, short = 'd', visible_short_alias='v', action = ArgAction::Count)]
pub debug: u8,
#[arg(long = "json", action = ArgAction::SetTrue)]
pub json_output: bool,
#[arg(long, action = ArgAction::SetTrue)]
pub capture_environ: bool,
#[arg(long, action = ArgAction::SetTrue)]
pub capture_status: bool,
#[arg(long, action = ArgAction::SetTrue)]
pub write_on_insert: bool,
#[arg(long, action = ArgAction::SetTrue)]
pub relative_pid: bool,
#[arg(long, alias = "pwd")]
pub cwd: Option<PathBuf>,
#[arg(long = "path", value_name = "PATH")]
pub path_var: Option<Vec<PathBuf>>,
#[arg(
short = 'o',
long = "output",
value_name = "RECORDING_FILE",
default_value = MEKA_FILE
)]
pub output_file: String,
#[arg(value_name = "COMMAND LINE", required = true)]
pub inputs: Vec<String>,
#[arg(long, action = ArgAction::SetTrue)]
pub wrap_shell: bool,
}
#[derive(Debug, Parser)]
pub struct AnalyzeArgs {
#[arg(global = true, short = 'd', visible_short_alias='v', action = ArgAction::Count)]
pub debug: u8,
#[arg(long, default_value_t = 50)]
pub min_cmd_size: usize,
#[arg(value_name = "RECORDING_FILE", default_value = MEKA_FILE)]
pub input_file: String,
}