use std::path::PathBuf;
use cbh_model::BenchmarkIdPrefix;
#[doc(hidden)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum LocalStorageSelection {
Path(PathBuf),
FromEnv,
}
#[doc(hidden)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum CacheSelection {
Path(PathBuf),
FromEnv,
}
#[doc(hidden)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Command {
Collect(CollectOptions),
Install(InstallOptions),
Analyze(AnalyzeOptions),
List(ListOptions),
Prune(PruneOptions),
Examine(ExamineOptions),
Backfill(BackfillOptions),
Bless(BlessOptions),
Unbless(UnblessOptions),
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct CollectOptions {
pub config_path: Option<PathBuf>,
pub repo: Option<PathBuf>,
pub local: Option<LocalStorageSelection>,
pub packages: Vec<String>,
pub excludes: Vec<String>,
pub benches: Vec<String>,
pub features: Vec<String>,
pub all_features: bool,
pub no_default_features: bool,
pub machine_key: Option<String>,
pub no_store: bool,
pub overwrite: bool,
pub skip_existing: bool,
pub passthrough: Vec<String>,
pub verbose: bool,
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct InstallOptions {
pub config_path: Option<PathBuf>,
pub verbose: bool,
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct AnalyzeOptions {
pub config_path: Option<PathBuf>,
pub repo: Option<PathBuf>,
pub local: Option<LocalStorageSelection>,
pub cache: Option<CacheSelection>,
pub context: Option<String>,
pub base: Option<String>,
pub no_dirty: bool,
pub since: Option<String>,
pub until: Option<String>,
pub engine: Vec<String>,
pub target_triple: Vec<String>,
pub machine_key: Vec<String>,
pub prefixes: Vec<BenchmarkIdPrefix>,
pub no_text: bool,
pub markdown: Option<PathBuf>,
pub json: Option<PathBuf>,
pub markdown_summary: Option<PathBuf>,
pub include_improvements: bool,
pub include_inactive: bool,
pub verbose: bool,
pub timing: bool,
}
impl AnalyzeOptions {
#[must_use]
pub fn stage_timings_enabled(&self) -> bool {
self.verbose || self.timing
}
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum ListSubject {
#[default]
Runs,
Discriminants,
Blessings,
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct ListOptions {
pub subject: ListSubject,
pub config_path: Option<PathBuf>,
pub repo: Option<PathBuf>,
pub local: Option<LocalStorageSelection>,
pub cache: Option<CacheSelection>,
pub context: Option<String>,
pub base: Option<String>,
pub no_dirty: bool,
pub since: Option<String>,
pub until: Option<String>,
pub engine: Vec<String>,
pub target_triple: Vec<String>,
pub machine_key: Vec<String>,
pub no_text: bool,
pub markdown: Option<PathBuf>,
pub json: Option<PathBuf>,
pub all: bool,
pub verbose: bool,
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct ExamineOptions {
pub config_path: Option<PathBuf>,
pub repo: Option<PathBuf>,
pub local: Option<LocalStorageSelection>,
pub cache: Option<CacheSelection>,
pub context: Option<String>,
pub base: Option<String>,
pub no_dirty: bool,
pub since: Option<String>,
pub until: Option<String>,
pub engine: Vec<String>,
pub target_triple: Vec<String>,
pub machine_key: Vec<String>,
pub benchmark: String,
pub metric: String,
pub no_text: bool,
pub markdown: Option<PathBuf>,
pub json: Option<PathBuf>,
pub verbose: bool,
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct PruneOptions {
pub config_path: Option<PathBuf>,
pub repo: Option<PathBuf>,
pub local: Option<LocalStorageSelection>,
pub cache: Option<CacheSelection>,
pub context: Option<String>,
pub base: Option<String>,
pub commit: Vec<String>,
pub since: Option<String>,
pub until: Option<String>,
pub engine: Vec<String>,
pub target_triple: Vec<String>,
pub machine_key: Vec<String>,
pub clean: bool,
pub dirty: bool,
pub prune_base: bool,
pub dry_run: bool,
pub no_text: bool,
pub markdown: Option<PathBuf>,
pub json: Option<PathBuf>,
pub verbose: bool,
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct BackfillOptions {
pub config_path: Option<PathBuf>,
pub repo: Option<PathBuf>,
pub local: Option<LocalStorageSelection>,
pub from: String,
pub to: String,
pub packages: Vec<String>,
pub excludes: Vec<String>,
pub benches: Vec<String>,
pub features: Vec<String>,
pub all_features: bool,
pub no_default_features: bool,
pub machine_key: Option<String>,
pub overwrite: bool,
pub ignore_errors: bool,
pub passthrough: Vec<String>,
pub verbose: bool,
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct BlessOptions {
pub config_path: Option<PathBuf>,
pub repo: Option<PathBuf>,
pub local: Option<LocalStorageSelection>,
pub context: Option<String>,
pub base: Option<String>,
pub engine: Vec<String>,
pub target_triple: Vec<String>,
pub machine_key: Vec<String>,
pub prefixes: Vec<BenchmarkIdPrefix>,
pub all: bool,
pub verbose: bool,
}
#[doc(hidden)]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct UnblessOptions {
pub config_path: Option<PathBuf>,
pub repo: Option<PathBuf>,
pub local: Option<LocalStorageSelection>,
pub context: Option<String>,
pub base: Option<String>,
pub engine: Vec<String>,
pub target_triple: Vec<String>,
pub machine_key: Vec<String>,
pub verbose: bool,
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn stage_timings_enabled_follows_verbose_or_timing() {
let options = |verbose, timing| AnalyzeOptions {
verbose,
timing,
..AnalyzeOptions::default()
};
assert!(!options(false, false).stage_timings_enabled());
assert!(options(true, false).stage_timings_enabled());
assert!(options(false, true).stage_timings_enabled());
assert!(options(true, true).stage_timings_enabled());
}
}