clap_fmt 0.1.1

Serialize a clap arg parser into the command-line arguments.
Documentation
use clap::Parser;
use clap_fmt::FmtArgs;
use serde::Serialize;

#[derive(Parser, Debug, Serialize)]
struct CliWithCounts {
    #[arg(short = 'v', long, action = clap::ArgAction::Count)]
    verbose: u8,

    #[arg(short = 'q', action = clap::ArgAction::Count)]
    quiet: u8,

    #[arg(long = "force", action = clap::ArgAction::Count)]
    force_level: u8,
}

#[test]
fn test_count_single() {
    let cli = CliWithCounts {
        verbose: 1,
        quiet: 0,
        force_level: 0,
    };
    assert_eq!(cli.to_args(), vec!["-v"]);
}

#[test]
fn test_count_double() {
    let cli = CliWithCounts {
        verbose: 2,
        quiet: 0,
        force_level: 0,
    };
    assert_eq!(cli.to_args(), vec!["-vv"]);
}

#[test]
fn test_count_triple() {
    let cli = CliWithCounts {
        verbose: 3,
        quiet: 0,
        force_level: 0,
    };
    assert_eq!(cli.to_args(), vec!["-vvv"]);
}

#[test]
fn test_count_many() {
    // Test count > 3 (should be separate flags)
    let cli = CliWithCounts {
        verbose: 5,
        quiet: 0,
        force_level: 0,
    };
    let result = cli.to_args();
    assert_eq!(result, vec!["-v", "-v", "-v", "-v", "-v"]);
}

#[test]
fn test_count_long_only() {
    let cli = CliWithCounts {
        verbose: 0,
        quiet: 0,
        force_level: 2,
    };
    let result = cli.to_args();
    assert_eq!(result, vec!["--force", "--force"]);
}

#[test]
fn test_count_short_only() {
    let cli = CliWithCounts {
        verbose: 0,
        quiet: 4,
        force_level: 0,
    };
    let result = cli.to_args();
    // Should be separate -q flags when > 3
    assert_eq!(result, vec!["-q", "-q", "-q", "-q"]);
}

#[test]
fn test_count_mixed() {
    let cli = CliWithCounts {
        verbose: 2,
        quiet: 1,
        force_level: 3,
    };
    let result = cli.to_args();
    assert_eq!(result, vec!["-vv", "-q", "--force", "--force", "--force"]);
}