use anyhow::{
Context,
Result,
};
use cargo_plugin_utils::common::get_owner_repo;
use clap::Parser;
use crate::github;
use crate::version::{
format_tag,
parse_version,
};
#[derive(Parser, Debug)]
pub struct LatestArgs {
#[arg(long)]
owner: Option<String>,
#[arg(long)]
repo: Option<String>,
#[arg(long, env = "GITHUB_TOKEN")]
github_token: Option<String>,
#[arg(long, default_value = "version")]
format: String,
}
pub fn latest(args: LatestArgs) -> Result<()> {
let (owner, repo) = get_owner_repo(args.owner, args.repo)?;
let github_token = args.github_token.as_deref();
let rt = tokio::runtime::Runtime::new().context("Failed to create tokio runtime")?;
let latest = rt.block_on(github::get_latest_release_version(
&owner,
&repo,
github_token,
))?;
let latest = latest.unwrap_or_else(|| "0.0.0".to_string());
match args.format.as_str() {
"version" => println!("{}", latest),
"tag" => {
let (major, minor, patch) = parse_version(&latest)?;
println!("{}", format_tag(major, minor, patch));
}
"json" => {
println!("{{\"version\":\"{}\",\"tag\":\"{}\"}}", latest, {
let (major, minor, patch) = parse_version(&latest)?;
format_tag(major, minor, patch)
});
}
_ => anyhow::bail!("Invalid format: {}", args.format),
}
Ok(())
}