1
0
Fork 0

Merge pull request 'add release download methods' (#29) from download into main

Reviewed-on: https://codeberg.org/Cyborus/forgejo-api/pulls/29
This commit is contained in:
Cyborus 2023-12-15 17:31:42 +00:00
commit 86a4acc1ad
5 changed files with 77 additions and 0 deletions

1
Cargo.lock generated
View file

@ -169,6 +169,7 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
name = "forgejo-api"
version = "0.1.0"
dependencies = [
"bytes",
"eyre",
"reqwest",
"serde",

View file

@ -14,6 +14,7 @@ url = { version = "2.4.0", features = ["serde"] }
serde = { version = "1.0.168", features = ["derive"] }
time = { version = "0.3.22", features = ["parsing", "serde", "formatting"] }
serde_json = "1.0.108"
bytes = "1.5.0"
[dev-dependencies]
eyre = "0.6.9"

View file

@ -181,6 +181,27 @@ impl Forgejo {
}
}
/// Like `execute`, but returns a `String`.
async fn execute_opt_raw(
&self,
request: Request,
) -> Result<Option<bytes::Bytes>, ForgejoError> {
let response = self.client.execute(request).await?;
match response.status() {
status if status.is_success() => Ok(Some(response.bytes().await?)),
StatusCode::NOT_FOUND => Ok(None),
status if status.is_client_error() => Err(ForgejoError::ApiError(
status,
response
.json::<ErrorMessage>()
.await?
.message
.unwrap_or_else(|| String::from("[no message]")),
)),
status => Err(ForgejoError::UnexpectedStatusCode(status)),
}
}
/// Like `execute`, but returns a `String`.
async fn execute_str(&self, request: Request) -> Result<String, ForgejoError> {
let response = self.client.execute(request).await?;

View file

@ -207,6 +207,52 @@ impl Forgejo {
.await
}
pub async fn download_release_zip(
&self,
owner: &str,
repo: &str,
release: u64,
) -> Result<Option<bytes::Bytes>, ForgejoError> {
let release = self.get_release(owner, repo, release).await;
let release = match release {
Ok(Some(release)) => release,
Ok(None) => return Ok(None),
Err(e) => return Err(e),
};
let request = self.client.get(release.zipball_url).build()?;
self.execute_opt_raw(request).await
}
pub async fn download_release_tarball(
&self,
owner: &str,
repo: &str,
release: u64,
) -> Result<Option<bytes::Bytes>, ForgejoError> {
let release = self.get_release(owner, repo, release).await;
let release = match release {
Ok(Some(release)) => release,
Ok(None) => return Ok(None),
Err(e) => return Err(e),
};
let request = self.client.get(release.tarball_url).build()?;
self.execute_opt_raw(request).await
}
pub async fn download_release_attachment(
&self,
owner: &str,
repo: &str,
release: u64,
attach: u64,
) -> Result<Option<bytes::Bytes>, ForgejoError> {
let release = self
.get_release_attachment(owner, repo, release, attach)
.await?;
let request = self.client.get(release.browser_download_url).build()?;
self.execute_opt_raw(request).await
}
pub async fn get_tags(
&self,
owner: &str,

View file

@ -220,6 +220,14 @@ async fn repo(api: &forgejo_api::Forgejo) -> eyre::Result<()> {
)
.await
.wrap_err("failed to create release attachment")?;
ensure!(
api.download_release_attachment("TestingAdmin", "test", release.id, attachment.id)
.await?
.as_deref()
== Some(b"This is a file!"),
"couldn't download attachment"
);
api.delete_release_attachment("TestingAdmin", "test", release.id, attachment.id)
.await
.wrap_err("failed to deleted attachment")?;