use clap::{Args, Subcommand};
use std::time::Duration;
use crate::args::{PositiveU64, PositiveUsize};
use super::super::defaults::{default_charts_path, default_tmp_path};
use super::super::parsers::{
parse_bool_env, parse_duration_arg, parse_positive_u64, parse_positive_usize,
};
#[derive(Debug, Subcommand, Clone)]
pub enum Command {
Quick(PresetQuickArgs),
Soak(PresetSoakArgs),
Spike(PresetSpikeArgs),
Distributed(PresetDistributedArgs),
Cleanup(CleanupArgs),
Compare(CompareArgs),
}
#[derive(Debug, Args, Clone)]
pub struct PresetQuickArgs {
#[arg(long, short)]
pub url: String,
#[arg(long = "duration", short = 't', default_value = "30", value_parser = parse_positive_u64)]
pub target_duration: PositiveU64,
#[arg(long = "max-tasks", default_value = "100", value_parser = parse_positive_usize)]
pub max_tasks: PositiveUsize,
#[arg(long = "rate", short = 'q', value_parser = parse_positive_u64)]
pub rate_limit: Option<PositiveU64>,
}
#[derive(Debug, Args, Clone)]
pub struct PresetSoakArgs {
#[arg(long, short)]
pub url: String,
#[arg(long = "duration", short = 't', default_value = "1800", value_parser = parse_positive_u64)]
pub target_duration: PositiveU64,
#[arg(long = "max-tasks", default_value = "300", value_parser = parse_positive_usize)]
pub max_tasks: PositiveUsize,
#[arg(long = "rate", short = 'q', value_parser = parse_positive_u64)]
pub rate_limit: Option<PositiveU64>,
}
#[derive(Debug, Args, Clone)]
pub struct PresetSpikeArgs {
#[arg(long, short)]
pub url: String,
#[arg(long = "duration", short = 't', default_value = "120", value_parser = parse_positive_u64)]
pub target_duration: PositiveU64,
#[arg(long = "max-tasks", default_value = "1000", value_parser = parse_positive_usize)]
pub max_tasks: PositiveUsize,
#[arg(long = "spawn-rate", default_value = "20", value_parser = parse_positive_usize)]
pub spawn_rate_per_tick: PositiveUsize,
#[arg(long = "spawn-interval", default_value = "100", value_parser = parse_positive_u64)]
pub tick_interval: PositiveU64,
}
#[derive(Debug, Args, Clone)]
pub struct PresetDistributedArgs {
#[arg(long, short)]
pub url: String,
#[arg(long = "agents", default_value = "3", value_parser = parse_positive_usize)]
pub agents: PositiveUsize,
#[arg(long = "duration", short = 't', default_value = "300", value_parser = parse_positive_u64)]
pub target_duration: PositiveU64,
#[arg(long = "controller-listen", default_value = "0.0.0.0:9009")]
pub controller_listen: String,
#[arg(long = "auth-token")]
pub auth_token: Option<String>,
}
#[derive(Debug, Args, Clone)]
pub struct CleanupArgs {
#[arg(long = "tmp-path", default_value_t = default_tmp_path())]
pub tmp_path: String,
#[arg(long = "with-charts")]
pub with_charts: bool,
#[arg(long = "charts-path", default_value_t = default_charts_path())]
pub charts_path: String,
#[arg(long = "older-than", value_parser = parse_duration_arg)]
pub older_than: Option<Duration>,
#[arg(long = "dry-run")]
pub dry_run: bool,
#[arg(long = "force")]
pub force: bool,
}
#[derive(Debug, Args, Clone)]
pub struct CompareArgs {
pub left: String,
pub right: String,
#[arg(long = "status", short = 's', default_value = "200")]
pub expected_status_code: u16,
#[arg(long = "replay-step", value_parser = parse_duration_arg)]
pub replay_step: Option<Duration>,
#[arg(long = "ui-window-ms", default_value = "10000", value_parser = parse_positive_u64)]
pub ui_window_ms: PositiveU64,
#[arg(long = "no-tui", alias = "no-ui")]
pub no_ui: bool,
#[arg(long = "no-color", env = "NO_COLOR", value_parser = parse_bool_env)]
pub no_color: bool,
#[arg(long = "left-label")]
pub left_label: Option<String>,
#[arg(long = "right-label")]
pub right_label: Option<String>,
}