use clap::{Args, ValueEnum};
use serde::{Deserialize, Serialize};
#[derive(Args, Debug, Clone)]
pub struct DiffArgs {
#[arg(long)]
pub from: Option<String>,
#[arg(long)]
pub to: Option<String>,
#[arg(value_name = "REF", num_args = 2)]
pub refs: Vec<String>,
#[arg(long, value_enum, default_value_t = DiffFormat::Md)]
pub format: DiffFormat,
#[arg(long)]
pub compact: bool,
#[arg(long, value_enum, default_value_t = ColorMode::Auto)]
pub color: ColorMode,
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "kebab-case")]
pub enum DiffFormat {
#[default]
Md,
Json,
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "kebab-case")]
pub enum ColorMode {
#[default]
Auto,
Always,
Never,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn diff_format_default_is_md() {
assert_eq!(DiffFormat::default(), DiffFormat::Md);
}
#[test]
fn diff_format_serde_roundtrip() {
for variant in [DiffFormat::Md, DiffFormat::Json] {
let json = serde_json::to_string(&variant).unwrap();
let back: DiffFormat = serde_json::from_str(&json).unwrap();
assert_eq!(back, variant);
}
}
#[test]
fn color_mode_default_is_auto() {
assert_eq!(ColorMode::default(), ColorMode::Auto);
}
}