use anyhow::Result;
use clap::Parser;
use crate::version::compare_versions;
#[derive(Parser, Debug)]
pub struct CompareArgs {
version1: String,
version2: String,
#[arg(long, default_value = "bool")]
format: String,
}
pub fn compare(args: CompareArgs) -> Result<()> {
let comparison = compare_versions(&args.version1, &args.version2)?;
match args.format.as_str() {
"bool" => {
match comparison {
Some(true) => println!("true"), Some(false) => println!("false"), None => println!("false"), }
}
"json" => match comparison {
Some(true) => println!(
"{{\"result\":\"greater\",\"version1\":\"{}\",\"version2\":\"{}\"}}",
args.version1, args.version2
),
Some(false) => println!(
"{{\"result\":\"less\",\"version1\":\"{}\",\"version2\":\"{}\"}}",
args.version1, args.version2
),
None => println!(
"{{\"result\":\"equal\",\"version1\":\"{}\",\"version2\":\"{}\"}}",
args.version1, args.version2
),
},
"diff" => match comparison {
Some(true) => println!("{} > {}", args.version1, args.version2),
Some(false) => println!("{} < {}", args.version1, args.version2),
None => println!("{} == {}", args.version1, args.version2),
},
_ => anyhow::bail!("Invalid format: {}", args.format),
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compare_version1_greater() {
let args = CompareArgs {
version1: "0.2.0".to_string(),
version2: "0.1.0".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_ok());
}
#[test]
fn test_compare_version1_less() {
let args = CompareArgs {
version1: "0.1.0".to_string(),
version2: "0.2.0".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_ok());
}
#[test]
fn test_compare_versions_equal() {
let args = CompareArgs {
version1: "0.1.0".to_string(),
version2: "0.1.0".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_ok());
}
#[test]
fn test_compare_json_format() {
let args = CompareArgs {
version1: "1.0.0".to_string(),
version2: "0.9.0".to_string(),
format: "json".to_string(),
};
assert!(compare(args).is_ok());
}
#[test]
fn test_compare_diff_format() {
let args = CompareArgs {
version1: "2.0.0".to_string(),
version2: "1.0.0".to_string(),
format: "diff".to_string(),
};
assert!(compare(args).is_ok());
}
#[test]
fn test_compare_with_v_prefix() {
let args = CompareArgs {
version1: "v0.2.0".to_string(),
version2: "v0.1.0".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_ok());
}
#[test]
fn test_compare_invalid_version1() {
let args = CompareArgs {
version1: "invalid".to_string(),
version2: "0.1.0".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_err());
}
#[test]
fn test_compare_invalid_version2() {
let args = CompareArgs {
version1: "0.1.0".to_string(),
version2: "invalid".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_err());
}
#[test]
fn test_compare_invalid_format() {
let args = CompareArgs {
version1: "0.1.0".to_string(),
version2: "0.2.0".to_string(),
format: "invalid".to_string(),
};
assert!(compare(args).is_err());
}
#[test]
fn test_compare_major_difference() {
let args = CompareArgs {
version1: "2.0.0".to_string(),
version2: "1.9.9".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_ok());
}
#[test]
fn test_compare_minor_difference() {
let args = CompareArgs {
version1: "1.2.0".to_string(),
version2: "1.1.9".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_ok());
}
#[test]
fn test_compare_patch_difference() {
let args = CompareArgs {
version1: "1.1.2".to_string(),
version2: "1.1.1".to_string(),
format: "bool".to_string(),
};
assert!(compare(args).is_ok());
}
}