use anyhow::Result;
use crate::cli::OutputContext;
use crate::provider::CliTokenProvider;
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub struct ReleaseNotesOutput {
pub response: aptu_core::ReleaseNotesResponse,
pub dry_run: bool,
pub release_url: Option<String>,
}
#[allow(clippy::too_many_arguments)]
pub async fn run_generate(
tag: Option<&str>,
repo: Option<&str>,
from_tag: Option<&str>,
to_tag: Option<&str>,
unreleased: bool,
update: bool,
dry_run: bool,
_ctx: &OutputContext,
) -> Result<ReleaseNotesOutput> {
if update && tag.is_none() && !unreleased {
return Err(anyhow::anyhow!(
"--update requires either a positional TAG or --unreleased flag"
));
}
let repo_str = if let Some(r) = repo {
r.to_string()
} else {
aptu_core::infer_repo_from_git().map_err(|e| anyhow::anyhow!("{e}"))?
};
let (owner, repo_name) = repo_str
.split_once('/')
.ok_or_else(|| anyhow::anyhow!("Repository must be in owner/repo format"))?;
let (from_ref, to_ref) = if unreleased {
(None, Some("HEAD"))
} else if let Some(t) = tag {
(None, Some(t))
} else {
(from_tag, to_tag)
};
let token_provider = CliTokenProvider;
let response =
aptu_core::generate_release_notes(&token_provider, owner, repo_name, from_ref, to_ref)
.await?;
let release_url = if update && !dry_run {
let release_tag = tag.unwrap_or("HEAD");
let body = aptu_core::render_release_notes_markdown(&response);
let url =
aptu_core::post_release_notes(&token_provider, owner, repo_name, release_tag, &body)
.await?;
Some(url)
} else {
None
};
Ok(ReleaseNotesOutput {
response,
dry_run,
release_url,
})
}