use std::path::PathBuf;
use clap::Parser;
use daktilo_lib::config::SoundVariation;
pub const BANNER: &str = r#"
.-------.
_|~~ ~~ |_
=(_|_______|_)=
|:::::::::|
|:::::::[]|
|o=======.|
`"""""""""`
"#;
#[derive(Debug, Default, Parser)]
#[clap(
version,
author = clap::crate_authors!("\n"),
about,
rename_all_env = "screaming-snake",
before_help = BANNER,
help_template = "\
{before-help}-=[ {name} {version} ]=-\n
{about-with-newline}Written by {author-with-newline}
{usage-heading}
{usage}
{all-args}{after-help}
",
)]
pub struct Args {
#[arg(short, long, action = clap::ArgAction::Count)]
pub verbose: u8,
#[arg(short, long, env, num_args(0..))]
pub preset: Vec<String>,
#[arg(short, long, aliases = vec!["ls", "list"])]
pub list_presets: bool,
#[arg(long)]
pub list_devices: bool,
#[arg(short, long, env = "DAKTILO_DEVICE", value_name = "DEVICE")]
pub device: Option<String>,
#[arg(short, long, env = "DAKTILO_CONFIG", value_name = "PATH")]
pub config: Option<PathBuf>,
#[arg(short, long)]
pub init: bool,
#[arg(long, hide = true)]
pub no_surprises: bool,
#[command(flatten)]
pub sound_variation_args: Option<SoundVariationArgs>,
}
#[derive(clap::Args, Default, Debug)]
pub struct SoundVariationArgs {
#[arg(
long,
env = "DAKTILO_VOLUME",
value_name = "PERCENT_UP[,PERCENT_DOWN]",
value_delimiter = ',',
num_args(1..2)
)]
pub variate_volume: Option<Vec<f32>>,
#[arg(
long,
env = "DAKTILO_TEMPO",
value_name = "PERCENT_UP[,PERCENT_DOWN]",
value_delimiter = ',',
num_args(1..2)
)]
pub variate_tempo: Option<Vec<f32>>,
}
impl From<SoundVariationArgs> for SoundVariation {
fn from(args: SoundVariationArgs) -> Self {
Self {
volume: args.variate_volume.map(|v| {
(
v.first().cloned().unwrap_or(1.0),
v.get(1).or(v.first()).cloned().unwrap_or(1.0),
)
}),
tempo: args.variate_tempo.map(|t| {
(
t.first().cloned().unwrap_or(1.0),
t.get(1).or(t.first()).cloned().unwrap_or(1.0),
)
}),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use clap::CommandFactory;
#[test]
fn test_args() {
Args::command().debug_assert();
}
}