use octocrab::Octocrab;
use octocrab::models::repos::Release;
use std::sync::Arc;
#[derive(Debug, Clone, Default)]
pub struct CreateReleaseOptions {
pub tag_name: String,
pub target_commitish: Option<String>,
pub name: Option<String>,
pub body: Option<String>,
pub draft: bool,
pub prerelease: bool,
}
#[derive(Debug, Clone)]
pub struct ReleaseResult {
pub id: u64,
pub tag_name: String,
pub name: String,
pub html_url: String,
pub upload_url: String,
pub draft: bool,
pub prerelease: bool,
}
pub async fn create_release(
client: Arc<Octocrab>,
owner: &str,
repo: &str,
options: CreateReleaseOptions,
) -> Result<ReleaseResult, octocrab::Error> {
let release = client
.repos(owner, repo)
.releases()
.create(&options.tag_name)
.target_commitish(options.target_commitish.as_deref().unwrap_or(""))
.name(options.name.as_deref().unwrap_or(&options.tag_name))
.body(options.body.as_deref().unwrap_or(""))
.draft(options.draft)
.prerelease(options.prerelease)
.send()
.await?;
Ok(ReleaseResult {
id: release.id.0,
tag_name: release.tag_name,
name: release.name.unwrap_or_default(),
html_url: release.html_url.to_string(),
upload_url: release.upload_url,
draft: release.draft,
prerelease: release.prerelease,
})
}
pub async fn get_release_by_tag(
client: Arc<Octocrab>,
owner: &str,
repo: &str,
tag: &str,
) -> Result<Option<Release>, octocrab::Error> {
client
.repos(owner, repo)
.releases()
.get_by_tag(tag)
.await
.map(Some)
.or_else(|e| {
if matches!(e, octocrab::Error::GitHub { .. }) {
Ok(None)
} else {
Err(e)
}
})
}
pub async fn delete_release(
client: Arc<Octocrab>,
owner: &str,
repo: &str,
release_id: u64,
) -> Result<(), octocrab::Error> {
client
.repos(owner, repo)
.releases()
.delete(release_id)
.await
}
pub async fn update_release(
client: Arc<Octocrab>,
owner: &str,
repo: &str,
release_id: u64,
draft: Option<bool>,
) -> Result<ReleaseResult, octocrab::Error> {
let release = if let Some(draft_value) = draft {
client
.repos(owner, repo)
.releases()
.update(release_id)
.draft(draft_value)
.send()
.await?
} else {
client
.repos(owner, repo)
.releases()
.update(release_id)
.send()
.await?
};
Ok(ReleaseResult {
id: release.id.0,
tag_name: release.tag_name,
name: release.name.unwrap_or_default(),
html_url: release.html_url.to_string(),
upload_url: release.upload_url,
draft: release.draft,
prerelease: release.prerelease,
})
}