use clap::{ArgAction, ArgGroup, Parser};
use crate::config;
#[derive(Debug, Parser)]
#[clap(
name = "git-revise",
about = "A command line utility for better commit"
)]
#[clap(version, author, about)]
#[clap(group(
ArgGroup::new("ai_group")
.args(&["generate", "translate"])
.multiple(false)
))]
#[clap(group(
ArgGroup::new("conflict_group")
.args(&["message"])
.conflicts_with_all(&["generate", "translate", "path", "exclude", "include"])
))]
pub struct Cli {
#[clap(short = 'g', long = "generate", action = ArgAction::SetTrue)]
pub generate: bool,
#[clap(short = 't', long = "translate", num_args = 0..=1)]
pub translate: Option<String>,
#[clap(short = 'a', long = "add", num_args = 0.., default_missing_value = ".", value_delimiter = ' ')]
pub path: Vec<String>,
#[clap(short = 'x', long = "exclude")]
pub exclude: Vec<String>,
#[clap(short = 'i', long = "include")]
pub include: Vec<String>,
#[clap(short = 'm', long = "message")]
pub message: Option<String>,
}
#[derive(Debug)]
pub struct ReviseCommands {
pub ai: Option<AICommand>,
pub add: Vec<String>,
pub excludes: Vec<String>,
pub message: Option<String>,
}
#[derive(Debug, PartialEq, Clone)]
pub enum AICommand {
Generate,
Translate(String),
}
pub fn parse_command() -> ReviseCommands {
let cli = Cli::parse();
let cfg = config::get_config();
let mut combined_excludes: Vec<String> = cfg.exclude_files.clone();
combined_excludes.extend(cli.exclude.clone());
for path in &cli.include {
combined_excludes.retain(|item| item != path);
}
ReviseCommands {
ai: if cli.generate {
Some(AICommand::Generate)
} else {
cli.translate.map(AICommand::Translate)
},
add: cli.path,
excludes: combined_excludes,
message: cli.message,
}
}