use crate::error::{ApiError, Result};
use reqwest::Client;
use serde_json::Value;
use url::Url;
pub struct ReleasesClient {
base_url: String,
client: Client,
}
impl ReleasesClient {
pub fn new(base_url: String, client: Client) -> Self {
Self { base_url, client }
}
pub fn with_auth(self, token: &str) -> Self {
self
}
pub async fn post_repo_releases_release_id_asset_upload_confirmation_upload_token_asset_path(
&self,
repo: String,
release_id: String,
upload_token: String,
asset_path: String,
) -> Result<Value> {
let path = format!("/{}/-/releases/{}/asset-upload-confirmation/{}/{}", repo, release_id, upload_token, asset_path);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::POST,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_releases_tags_tag(
&self,
repo: String,
tag: String,
) -> Result<Value> {
let path = format!("/{}/-/releases/tags/{}", repo, tag);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_releases_release_id(
&self,
repo: String,
release_id: String,
) -> Result<Value> {
let path = format!("/{}/-/releases/{}", repo, release_id);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn delete_repo_releases_release_id(
&self,
repo: String,
release_id: String,
) -> Result<Value> {
let path = format!("/{}/-/releases/{}", repo, release_id);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::DELETE,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn patch_repo_releases_release_id(
&self,
repo: String,
release_id: String,
patch_release_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/releases/{}", repo, release_id);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PATCH,
url
);
request = request.json(&patch_release_form);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_releases_release_id_assets_asset_id(
&self,
repo: String,
release_id: String,
asset_id: String,
) -> Result<Value> {
let path = format!("/{}/-/releases/{}/assets/{}", repo, release_id, asset_id);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn delete_repo_releases_release_id_assets_asset_id(
&self,
repo: String,
release_id: String,
asset_id: String,
) -> Result<Value> {
let path = format!("/{}/-/releases/{}/assets/{}", repo, release_id, asset_id);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::DELETE,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn post_repo_releases_release_id_asset_upload_url(
&self,
repo: String,
release_id: String,
create_release_asset_upload_url_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/releases/{}/asset-upload-url", repo, release_id);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&create_release_asset_upload_url_form);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_releases(
&self,
repo: String,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/releases", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = page {
url.query_pairs_mut().append_pair("page", &value.to_string());
}
if let Some(value) = page_size {
url.query_pairs_mut().append_pair("page_size", &value.to_string());
}
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn post_repo_releases(
&self,
repo: String,
create_release_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/releases", repo);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&create_release_form);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_releases_latest(
&self,
repo: String,
) -> Result<Value> {
let path = format!("/{}/-/releases/latest", repo);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
}