use cargo_advent::context::AocData;
use clap::{Args, Parser, Subcommand};
use tracing::debug;
#[derive(Debug, Parser)]
#[command(version, about, long_about = None)]
pub struct RootCliArgs {
#[arg(short, long, action=clap::ArgAction::Count, env="ADVENT_VERBOSITY")]
pub verbosity: u8,
#[command(subcommand)]
pub mode: ModeSubCommands,
}
#[derive(Debug, Subcommand)]
pub enum ModeSubCommands {
#[command(name = "generate")]
GenerateRustProject {
#[clap(flatten)]
data: GenerateRustProjectCliArgs,
},
}
#[derive(Debug, Clone, Args)]
pub struct GenerateRustProjectCliArgs {
#[arg(short = 'n', long, env = "ADVENT_PROJECT_NAME")]
pub project_name: Option<String>,
#[arg(
short,
long,
default_value = "https://github.com/codersparks-aoc/aoc-rust-template.git",
env = "ADVENT_TEMPLATE_URL"
)]
pub template: String,
#[clap(flatten)]
pub aoc_cli_args: AocCliArgs,
#[arg(short, long, env = "ADVENT_PROJECT_PATH")]
pub path: Option<String>,
}
#[derive(Debug, Clone, Args)]
pub struct AocCliArgs {
#[arg(short, long, env = "ADVENT_BASE_URL")]
pub base_url: Option<String>,
#[arg(short, long, env = "ADVENT_YEAR")]
pub year: Option<i32>,
#[arg(short, long, env = "ADVENT_DAY")]
pub day: Option<u32>,
}
impl From<&AocCliArgs> for AocData {
fn from(args: &AocCliArgs) -> Self {
let mut aoc_data = AocData::default();
if let Some(base_url) = args.base_url.clone() {
aoc_data.base_url = base_url;
}
if let Some(year) = args.year {
aoc_data.year = year;
}
if let Some(day) = args.day {
aoc_data.day = day;
}
debug!("parsed aoc_data: {:#?}", aoc_data);
aoc_data
}
}