use anyhow::Result;
use clap::Parser;
use crate::version::{
format_tag,
parse_version,
};
#[derive(Parser, Debug)]
pub struct TagArgs {
version: String,
#[arg(long, default_value = "tag")]
format: String,
}
pub fn tag(args: TagArgs) -> Result<()> {
let (major, minor, patch) = parse_version(&args.version)?;
let tag = format_tag(major, minor, patch);
match args.format.as_str() {
"tag" => println!("{}", tag),
"json" => println!("{{\"tag\":\"{}\",\"version\":\"{}\"}}", tag, args.version),
_ => anyhow::bail!("Invalid format: {}", args.format),
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tag_version_format() {
let args = TagArgs {
version: "0.1.2".to_string(),
format: "tag".to_string(),
};
assert!(tag(args).is_ok());
}
#[test]
fn test_tag_with_v_prefix() {
let args = TagArgs {
version: "v0.1.2".to_string(),
format: "tag".to_string(),
};
assert!(tag(args).is_ok());
}
#[test]
fn test_tag_json_format() {
let args = TagArgs {
version: "1.2.3".to_string(),
format: "json".to_string(),
};
assert!(tag(args).is_ok());
}
#[test]
fn test_tag_invalid_version() {
let args = TagArgs {
version: "invalid".to_string(),
format: "tag".to_string(),
};
assert!(tag(args).is_err());
}
#[test]
fn test_tag_invalid_format() {
let args = TagArgs {
version: "0.1.2".to_string(),
format: "invalid".to_string(),
};
assert!(tag(args).is_err());
}
#[test]
fn test_tag_major_version() {
let args = TagArgs {
version: "10.20.30".to_string(),
format: "tag".to_string(),
};
assert!(tag(args).is_ok());
}
}