use snafu::ResultExt;
use crate::{params, Octocrab};
pub struct ActionsHandler<'octo> {
crab: &'octo Octocrab,
}
impl<'octo> ActionsHandler<'octo> {
pub(crate) fn new(crab: &'octo Octocrab) -> Self {
Self { crab }
}
pub async fn add_selected_repo_to_org_secret(
&self,
org: impl AsRef<str>,
secret_name: impl AsRef<str>,
repository_id: u64,
) -> crate::Result<()> {
let route = format!(
"/orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}",
org = org.as_ref(),
secret_name = secret_name.as_ref(),
repository_id = repository_id,
);
crate::map_github_error(self.crab._put(&route, None::<&()>).await?)
.await
.map(drop)
}
pub async fn remove_selected_repo_from_org_secret(
&self,
org: impl AsRef<str>,
secret_name: impl AsRef<str>,
repository_id: u64,
) -> crate::Result<()> {
let route = format!(
"/orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}",
org = org.as_ref(),
secret_name = secret_name.as_ref(),
repository_id = repository_id,
);
crate::map_github_error(self.crab._delete(&route, None::<&()>).await?)
.await
.map(drop)
}
pub async fn cancel_workflow_run(
&self,
owner: impl AsRef<str>,
repo: impl AsRef<str>,
run_id: u64,
) -> crate::Result<()> {
let route = format!(
"/repos/{owner}/{repo}/actions/runs/{run_id}/cancel",
owner = owner.as_ref(),
repo = repo.as_ref(),
run_id = run_id,
);
crate::map_github_error(self.crab._post(&route, None::<&()>).await?)
.await
.map(drop)
}
async fn follow_location_to_data(
&self,
response: reqwest::Response,
) -> crate::Result<bytes::Bytes> {
let location = response
.headers()
.get(reqwest::header::LOCATION)
.expect("No Location header found in download_workflow_run_logs")
.to_str()
.expect("Location URL not valid str");
self.crab
._get(location, None::<&()>)
.await?
.bytes()
.await
.context(crate::error::Http)
}
pub async fn download_workflow_run_logs(
&self,
owner: impl AsRef<str>,
repo: impl AsRef<str>,
run_id: u64,
) -> crate::Result<bytes::Bytes> {
let route = format!(
"/repos/{owner}/{repo}/actions/runs/{run_id}/logs",
owner = owner.as_ref(),
repo = repo.as_ref(),
run_id = run_id,
);
self.follow_location_to_data(self.crab._get(&route, None::<&()>).await?)
.await
}
pub async fn download_artifact(
&self,
owner: impl AsRef<str>,
repo: impl AsRef<str>,
artifact_id: u64,
archive_format: params::actions::ArchiveFormat,
) -> crate::Result<bytes::Bytes> {
let route = format!(
"/repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}",
owner = owner.as_ref(),
repo = repo.as_ref(),
artifact_id = artifact_id,
archive_format = archive_format,
);
self.follow_location_to_data(self.crab._get(&route, None::<&()>).await?)
.await
}
pub async fn delete_workflow_run_logs(
&self,
owner: impl AsRef<str>,
repo: impl AsRef<str>,
run_id: u64,
) -> crate::Result<()> {
let route = format!(
"/repos/{owner}/{repo}/actions/runs/{run_id}/logs",
owner = owner.as_ref(),
repo = repo.as_ref(),
run_id = run_id,
);
crate::map_github_error(self.crab._delete(&route, None::<&()>).await?)
.await
.map(drop)
}
pub async fn get_org_public_key(
&self,
org: impl AsRef<str>,
) -> crate::Result<crate::models::PublicKey> {
let route = format!("/orgs/{org}/actions/secrets/public-key", org = org.as_ref());
self.crab.get(route, None::<&()>).await
}
}