use std::path::PathBuf;
#[cfg(not(windows))]
use std::time::Duration;
#[derive(Debug, clap::Parser)]
#[clap(version, about)]
pub struct Params {
pub repositories: Vec<PathBuf>,
#[clap(long, short = 'p')]
pub prefix: Option<String>,
#[clap(short, long)]
pub verbose: bool,
#[cfg(not(windows))]
#[clap(
short,
long,
default_value = "500ms",
value_parser = parse_duration,
allow_hyphen_values = true, // Better error message.
)]
pub timeout: Duration,
}
#[cfg(not(windows))]
fn parse_duration(input: &str) -> Result<Duration, clap::Error> {
use clap::error::ErrorKind;
use clap::CommandFactory;
let input = input.trim();
if input.is_empty() || input == "0" || input.to_lowercase() == "none" {
return Ok(Duration::ZERO);
}
if input.starts_with('-') {
Err(Params::command()
.error(ErrorKind::InvalidValue, "duration cannot be negative"))
} else if input.chars().all(|c| c.is_ascii_digit()) {
input
.parse::<u64>()
.map(Duration::from_secs)
.map_err(|error| {
Params::command().error(ErrorKind::InvalidValue, error)
})
} else {
duration_str::parse(input).map_err(|error| {
Params::command().error(ErrorKind::InvalidValue, error)
})
}
}