use crate::error::{ApiError, Result};
use reqwest::Client;
use serde_json::Value;
use url::Url;
pub struct GitClient {
base_url: String,
client: Client,
}
impl GitClient {
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 get_repo_git_commits_ref(
&self,
repo: String,
r#ref: String,
) -> Result<Value> {
let path = format!("/{}/-/git/commits/{}", repo, r#ref);
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_git_commit_statuses_commitish(
&self,
repo: String,
commitish: String,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-statuses/{}", repo, commitish);
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_git_commit_assets_sha_1(
&self,
repo: String,
sha_1: String,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-assets/{}", repo, sha_1);
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_git_archive_compare_changed_files_base_head(
&self,
repo: String,
base_head: String,
) -> Result<Value> {
let path = format!("/{}/-/git/archive-compare-changed-files/{}", repo, base_head);
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_git_head(
&self,
repo: String,
) -> Result<Value> {
let path = format!("/{}/-/git/head", 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()))
}
}
pub async fn get_repo_git_tag_annotations_tag(
&self,
repo: String,
tag: String,
) -> Result<Value> {
let path = format!("/{}/-/git/tag-annotations/{}", 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 put_repo_git_tag_annotations_tag(
&self,
repo: String,
tag: String,
put_tag_annotations_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/git/tag-annotations/{}", repo, tag);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PUT,
url
);
request = request.json(&put_tag_annotations_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_git_archive_commit_changed_files_sha_1(
&self,
repo: String,
sha_1: String,
) -> Result<Value> {
let path = format!("/{}/-/git/archive-commit-changed-files/{}", repo, sha_1);
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_git_branches_branch(
&self,
repo: String,
branch: String,
) -> Result<Value> {
let path = format!("/{}/-/git/branches/{}", repo, branch);
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_git_branches_branch(
&self,
repo: String,
branch: String,
) -> Result<Value> {
let path = format!("/{}/-/git/branches/{}", repo, branch);
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_git_commit_annotations_in_batch(
&self,
repo: String,
get_commit_annotations_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-annotations-in-batch", repo);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&get_commit_annotations_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_git_tags(
&self,
repo: String,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/git/tags", 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_git_tags(
&self,
repo: String,
post_tag_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/git/tags", repo);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&post_tag_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_git_commit_annotations_sha(
&self,
repo: String,
sha: String,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-annotations/{}", repo, sha);
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 put_repo_git_commit_annotations_sha(
&self,
repo: String,
sha: String,
put_commit_annotations_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-annotations/{}", repo, sha);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PUT,
url
);
request = request.json(&put_commit_annotations_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 post_repo_git_blobs(
&self,
repo: String,
post_blob_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/git/blobs", repo);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&post_blob_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_git_commits(
&self,
repo: String,
sha: Option<String>,
author: Option<String>,
committer: Option<String>,
since: Option<String>,
until: Option<String>,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/git/commits", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = sha {
url.query_pairs_mut().append_pair("sha", &value.to_string());
}
if let Some(value) = author {
url.query_pairs_mut().append_pair("author", &value.to_string());
}
if let Some(value) = committer {
url.query_pairs_mut().append_pair("committer", &value.to_string());
}
if let Some(value) = since {
url.query_pairs_mut().append_pair("since", &value.to_string());
}
if let Some(value) = until {
url.query_pairs_mut().append_pair("until", &value.to_string());
}
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_git_commit_assets_sha_1_asset_upload_url(
&self,
repo: String,
sha_1: String,
create_commit_asset_upload_url_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-assets/{}/asset-upload-url", repo, sha_1);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&create_commit_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 delete_repo_git_commit_assets_sha_1_asset_id(
&self,
repo: String,
sha_1: String,
asset_id: String,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-assets/{}/{}", repo, sha_1, 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 delete_repo_git_commit_annotations_sha_key(
&self,
repo: String,
sha: String,
key: String,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-annotations/{}/{}", repo, sha, key);
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 get_repo_git_compare_base_head(
&self,
repo: String,
base_head: String,
) -> Result<Value> {
let path = format!("/{}/-/git/compare/{}", repo, base_head);
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 post_repo_git_commit_assets_sha_1_asset_upload_confirmation_upload_token_asset_path(
&self,
repo: String,
sha_1: String,
upload_token: String,
asset_path: String,
) -> Result<Value> {
let path = format!("/{}/-/git/commit-assets/{}/asset-upload-confirmation/{}/{}", repo, sha_1, 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_git_branches(
&self,
repo: String,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/git/branches", 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_git_branches(
&self,
repo: String,
create_branch_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/git/branches", repo);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&create_branch_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_git_contents_file_path(
&self,
repo: String,
file_path: String,
r#ref: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/git/contents/{}", repo, file_path);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = r#ref {
url.query_pairs_mut().append_pair("ref", &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 get_repo_git_tags_tag(
&self,
repo: String,
tag: String,
) -> Result<Value> {
let path = format!("/{}/-/git/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 delete_repo_git_tags_tag(
&self,
repo: String,
tag: String,
) -> Result<Value> {
let path = format!("/{}/-/git/tags/{}", repo, tag);
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 delete_repo_git_tag_annotations_tag_with_key(
&self,
repo: String,
tag_with_key: String,
) -> Result<Value> {
let path = format!("/{}/-/git/tag-annotations/{}", repo, tag_with_key);
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()))
}
}
}