use std::path::PathBuf;
use clap::{Args, Subcommand};
use harn_kernel::{
PORTABLE_MAX_COMPILE_ITERATIONS, PORTABLE_MAX_DISPATCH_ITERATIONS, PORTABLE_MAX_WORKERS,
};
use super::{PortableEntryKindArg, ProfileArgs};
#[derive(Debug, Args)]
#[command(arg_required_else_help = true)]
pub(crate) struct BenchArgs {
#[command(subcommand)]
pub command: Option<BenchCommand>,
pub file: Option<String>,
#[arg(short = 'n', long, default_value_t = 10)]
pub iterations: usize,
#[command(flatten)]
pub profile: ProfileArgs,
}
#[derive(Debug, Subcommand)]
pub(crate) enum BenchCommand {
Portable(BenchPortableArgs),
Replay(BenchReplayArgs),
}
#[derive(Debug, Args)]
pub(crate) struct BenchPortableArgs {
pub source: PathBuf,
#[arg(long, default_value = "main")]
pub entry: String,
#[arg(long = "entry-kind", value_enum, default_value_t = PortableEntryKindArg::Function)]
pub entry_kind: PortableEntryKindArg,
#[arg(long, value_name = "PATH")]
pub input: PathBuf,
#[arg(
short = 'n',
long,
default_value_t = 500,
value_parser = clap::builder::RangedU64ValueParser::<usize>::new()
.range(1..=PORTABLE_MAX_DISPATCH_ITERATIONS as u64)
)]
pub iterations: usize,
#[arg(
long,
default_value_t = 1,
value_parser = clap::builder::RangedU64ValueParser::<usize>::new()
.range(1..=PORTABLE_MAX_WORKERS as u64)
)]
pub threads: usize,
#[arg(
long = "compile-iterations",
default_value_t = 30,
value_parser = clap::builder::RangedU64ValueParser::<usize>::new()
.range(1..=PORTABLE_MAX_COMPILE_ITERATIONS as u64)
)]
pub compile_iterations: usize,
#[arg(long)]
pub json: bool,
#[arg(long, value_name = "PATH")]
pub output: Option<PathBuf>,
}
#[derive(Debug, Args)]
pub(crate) struct BenchReplayArgs {
pub selection: Option<PathBuf>,
#[arg(long)]
pub json: bool,
#[arg(long, value_name = "PATH")]
pub output: Option<PathBuf>,
#[arg(long, value_name = "TEXT")]
pub filter: Option<String>,
#[arg(
long = "suite-name",
default_value = "harn-canonical-replay-determinism"
)]
pub suite_name: String,
#[arg(long, value_name = "ADAPTER", requires_all = ["external_first", "external_second"])]
pub adapter: Option<String>,
#[arg(long = "external-first", value_name = "PATH", requires = "adapter")]
pub external_first: Option<PathBuf>,
#[arg(long = "external-second", value_name = "PATH", requires = "adapter")]
pub external_second: Option<PathBuf>,
#[arg(long = "external-name", default_value = "external-adapted-replay")]
pub external_name: String,
}