use clap::{Args, Parser, Subcommand, ValueEnum};
use serde::{Deserialize, Serialize};
use strum_macros::AsRefStr;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
pub struct Cli {
pub address: Option<String>,
#[command(subcommand)]
pub commands: Option<Commands>,
#[arg(long, short, next_line_help = false, use_value_delimiter = true)]
pub units: Vec<ArgUnits>,
#[arg(short, long, global = true)]
pub language: Option<String>,
#[arg(short, long, action, global = true)]
pub greeting: bool,
#[arg(short, long, action, group = "config_file_action", global = true)]
pub save: bool,
#[arg(short, long, action, group = "config_file_action", global = true)]
pub reset: bool,
}
#[derive(Subcommand)]
pub enum Commands {
#[clap(short_flag = 'f')]
Forecast(Forecast),
}
#[derive(Debug, Args)]
pub struct Forecast {
#[arg(short, value_parser, action)]
pub week: bool,
#[arg(short, value_parser, action)]
pub day: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum, AsRefStr, Serialize, Deserialize)]
#[strum(serialize_all = "snake_case")]
pub enum ArgUnits {
#[value(name = "(c)elsius", aliases = ["c", "celsius"])]
Celsius,
#[value(name = "(f)ahrenheit", aliases = ["f", "fahrenheit"])]
Fahrenheit,
Kmh,
Mph,
#[value(name = "(kn)ots", aliases = ["kn", "knots"])]
#[strum(serialize = "kn")]
Knots,
Ms,
}