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:
commit
86a4acc1ad
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -169,6 +169,7 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
|||
name = "forgejo-api"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"eyre",
|
||||
"reqwest",
|
||||
"serde",
|
||||
|
|
|
@ -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"
|
||||
|
|
21
src/lib.rs
21
src/lib.rs
|
@ -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?;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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")?;
|
||||
|
|
Loading…
Reference in a new issue