use crate::context::{OutputFormat, TracingTargetOption};
use crate::log_level::LogLevel;
use clap::{ArgGroup, Args, ValueHint};
use std::path::PathBuf;
#[derive(Debug, Args)]
#[command(group(ArgGroup::new("paths").args(&["path", "manifest_path"])))]
pub struct SharedOpts {
#[arg(long, value_name = "Crate Directory", global = true, value_hint = ValueHint::DirPath)]
pub path: Option<PathBuf>,
#[arg(long, value_name = "Cargo Manifest", global = true, value_hint = ValueHint::FilePath)]
pub manifest_path: Option<PathBuf>,
#[command(flatten)]
pub workspace: clap_cargo::Workspace,
#[command(flatten)]
pub user_output_opts: UserOutputOpts,
#[command(flatten)]
pub debug_output_opts: DebugOutputOpts,
}
#[derive(Debug, Args)]
#[command(next_help_heading = "User output options")]
pub struct UserOutputOpts {
#[arg(
long,
value_enum,
default_value_t,
value_name = "FORMAT",
global = true
)]
output_format: OutputFormat,
#[arg(long, global = true, conflicts_with = "output_format")]
no_user_output: bool,
}
impl UserOutputOpts {
pub fn effective_output_format(&self) -> OutputFormat {
if self.no_user_output {
OutputFormat::None
} else {
self.output_format
}
}
}
#[derive(Debug, Args)]
#[command(next_help_heading = "Debug output options")]
pub struct DebugOutputOpts {
#[arg(long, global = true)]
pub no_log: bool,
#[arg(
long,
value_enum,
default_value_t,
value_name = "LOG TARGET",
global = true
)]
pub log_target: TracingTargetOption,
#[arg(long, value_enum, default_value_t, value_name = "LEVEL", global = true)]
pub log_level: LogLevel,
}