use crate::error::{ApiError, Result};
use reqwest::Client;
use serde_json::Value;
use url::Url;
pub struct PullsClient {
base_url: String,
client: Client,
}
impl PullsClient {
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_pulls_number_comments(
&self,
repo: String,
number: String,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/comments", repo, number);
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_pulls_number_comments(
&self,
repo: String,
number: String,
post_pull_comment_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/comments", repo, number);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&post_pull_comment_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_pulls_number_commit_statuses(
&self,
repo: String,
number: i64,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/commit-statuses", repo, number);
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_pulls_number_labels(
&self,
repo: String,
number: String,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/labels", repo, number);
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_pulls_number_labels(
&self,
repo: String,
number: String,
post_pull_labels_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/labels", repo, number);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&post_pull_labels_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 put_repo_pulls_number_labels(
&self,
repo: String,
number: String,
put_pull_labels_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/labels", repo, number);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PUT,
url
);
request = request.json(&put_pull_labels_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_pulls_number_labels(
&self,
repo: String,
number: String,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/labels", repo, number);
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_pulls_number_labels_name(
&self,
repo: String,
number: String,
name: String,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/labels/{}", repo, number, name);
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_pulls_number_comments_comment_id(
&self,
repo: String,
number: String,
comment_id: i64,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/comments/{}", repo, number, comment_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 patch_repo_pulls_number_comments_comment_id(
&self,
repo: String,
number: String,
comment_id: i64,
patch_pull_comment_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/comments/{}", repo, number, comment_id);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PATCH,
url
);
request = request.json(&patch_pull_comment_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_pulls_number_reviews(
&self,
repo: String,
number: String,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/reviews", repo, number);
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_pulls_number_reviews(
&self,
repo: String,
number: String,
post_pull_review_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/reviews", repo, number);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&post_pull_review_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_pulls_number_reviews_review_id_comments(
&self,
repo: String,
number: i64,
review_id: i64,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/reviews/{}/comments", repo, number, review_id);
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 get_repo_pull_in_batch(
&self,
repo: String,
n: Vec<String>,
) -> Result<Value> {
let path = format!("/{}/-/pull-in-batch", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
for item in &n {
url.query_pairs_mut().append_pair("n", item);
}
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_pulls_number_merge(
&self,
repo: String,
number: String,
merge_pull_request_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/merge", repo, number);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PUT,
url
);
request = request.json(&merge_pull_request_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_pulls_number_files(
&self,
repo: String,
number: String,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/files", repo, number);
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_pulls_number_commits(
&self,
repo: String,
number: String,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/commits", repo, number);
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 get_repo_pulls_number_assignees(
&self,
repo: String,
number: String,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/assignees", repo, number);
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_pulls_number_assignees(
&self,
repo: String,
number: String,
post_pull_assignees_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/assignees", repo, number);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&post_pull_assignees_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_pulls_number_assignees(
&self,
repo: String,
number: String,
delete_pull_assignees_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/assignees", repo, number);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::DELETE,
url
);
request = request.json(&delete_pull_assignees_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_pulls(
&self,
repo: String,
page: Option<i64>,
page_size: Option<i64>,
state: Option<String>,
authors: Option<String>,
reviewers: Option<String>,
assignees: Option<String>,
base_ref: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/pulls", 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());
}
if let Some(value) = state {
url.query_pairs_mut().append_pair("state", &value.to_string());
}
if let Some(value) = authors {
url.query_pairs_mut().append_pair("authors", &value.to_string());
}
if let Some(value) = reviewers {
url.query_pairs_mut().append_pair("reviewers", &value.to_string());
}
if let Some(value) = assignees {
url.query_pairs_mut().append_pair("assignees", &value.to_string());
}
if let Some(value) = base_ref {
url.query_pairs_mut().append_pair("base_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 post_repo_pulls(
&self,
repo: String,
post_pull_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls", repo);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&post_pull_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_pulls_number_assignees_assignee(
&self,
repo: String,
number: String,
assignee: String,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}/assignees/{}", repo, number, assignee);
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_pulls_number(
&self,
repo: String,
number: String,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}", repo, number);
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 patch_repo_pulls_number(
&self,
repo: String,
number: String,
update_pull_request_form: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/pulls/{}", repo, number);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PATCH,
url
);
request = request.json(&update_pull_request_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()))
}
}
}