1
0
Fork 0

add release download methods

This commit is contained in:
Cyborus 2023-12-15 11:44:21 -05:00
parent 78d44348da
commit 2e50a93f1e
No known key found for this signature in database
4 changed files with 48 additions and 0 deletions

1
Cargo.lock generated
View file

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

View file

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

View file

@ -181,6 +181,24 @@ 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`. /// Like `execute`, but returns a `String`.
async fn execute_str(&self, request: Request) -> Result<String, ForgejoError> { async fn execute_str(&self, request: Request) -> Result<String, ForgejoError> {
let response = self.client.execute(request).await?; let response = self.client.execute(request).await?;

View file

@ -207,6 +207,34 @@ impl Forgejo {
.await .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( pub async fn get_tags(
&self, &self,
owner: &str, owner: &str,