#![allow(clippy::all)]
#![allow(missing_docs)]
#![allow(unused_imports)]
#![allow(unused_mut)]
use reqwest::Method;
use serde::Serialize;
use crate::error::{ApiError, Result};
use crate::http::HttpInner;
use crate::models;
#[derive(Debug, Clone)]
pub struct IssuesClient {
inner: HttpInner,
}
impl IssuesClient {
pub fn new(inner: HttpInner) -> Self {
Self { inner }
}
pub async fn can_user_be_assigned_to_issue(
&self,
repo: String,
number: String,
assignee: String,
) -> Result<serde_json::Value> {
let path = format!("/{}/-/issues/{}/assignees/{}", repo, number, assignee);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<serde_json::Value>(Method::GET, url)
.await
}
pub async fn create_issue(
&self,
repo: String,
body: &crate::models::PostIssueForm,
) -> Result<crate::models::IssueDetail> {
let path = format!("/{}/-/issues", repo);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueDetail, _>(Method::POST, url, body)
.await
}
pub async fn delete_issue_assignees(
&self,
repo: String,
number: String,
body: &crate::models::DeleteIssueAssigneesForm,
) -> Result<crate::models::IssueDetail> {
let path = format!("/{}/-/issues/{}/assignees", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueDetail, _>(Method::DELETE, url, body)
.await
}
pub async fn delete_issue_label(
&self,
repo: String,
number: i64,
name: String,
) -> Result<crate::models::Label> {
let path = format!("/{}/-/issues/{}/labels/{}", repo, number, name);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<crate::models::Label>(Method::DELETE, url)
.await
}
pub async fn delete_issue_labels(
&self,
repo: String,
number: i64,
) -> Result<serde_json::Value> {
let path = format!("/{}/-/issues/{}/labels", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<serde_json::Value>(Method::DELETE, url)
.await
}
pub async fn get_issue(&self, repo: String, number: i64) -> Result<crate::models::IssueDetail> {
let path = format!("/{}/-/issues/{}", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<crate::models::IssueDetail>(Method::GET, url)
.await
}
pub async fn get_issue_comment(
&self,
repo: String,
number: i64,
comment_id: i64,
) -> Result<crate::models::IssueComment> {
let path = format!("/{}/-/issues/{}/comments/{}", repo, number, comment_id);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<crate::models::IssueComment>(Method::GET, url)
.await
}
pub async fn get_issue_files(
&self,
repo: String,
file_path: String,
) -> Result<serde_json::Value> {
let path = format!("/{}/-/files/issues/{}", repo, file_path);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<serde_json::Value>(Method::GET, url)
.await
}
pub async fn get_issue_imgs(
&self,
repo: String,
img_path: String,
) -> Result<serde_json::Value> {
let path = format!("/{}/-/imgs/issues/{}", repo, img_path);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<serde_json::Value>(Method::GET, url)
.await
}
pub async fn get_issue_properties(
&self,
repo: String,
number: i64,
) -> Result<Vec<crate::models::IssueProperty>> {
let path = format!("/{}/-/issues/{}/property", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<Vec<crate::models::IssueProperty>>(Method::GET, url)
.await
}
pub async fn list_issue_activities(
&self,
repo: String,
number: i64,
query: &ListIssueActivitiesQuery,
) -> Result<Vec<crate::models::IssueActivity>> {
let path = format!("/{}/-/issues/{}/activities", repo, number);
let mut url = self.inner.url(&path)?;
{
let mut pairs = url.query_pairs_mut();
if let Some(v) = query.page {
pairs.append_pair("page", &v.to_string());
}
if let Some(v) = query.page_size {
pairs.append_pair("page_size", &v.to_string());
}
drop(pairs);
}
self.inner
.execute::<Vec<crate::models::IssueActivity>>(Method::GET, url)
.await
}
pub async fn list_issue_activities_latest(
&self,
repo: String,
number: i64,
id: i64,
) -> Result<Vec<crate::models::IssueActivity>> {
let path = format!("/{}/-/issues/{}/activities/latest/{}", repo, number, id);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<Vec<crate::models::IssueActivity>>(Method::GET, url)
.await
}
pub async fn list_issue_assignees(
&self,
repo: String,
number: String,
) -> Result<Vec<crate::models::UserInfo>> {
let path = format!("/{}/-/issues/{}/assignees", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<Vec<crate::models::UserInfo>>(Method::GET, url)
.await
}
pub async fn list_issue_comments(
&self,
repo: String,
number: i64,
query: &ListIssueCommentsQuery,
) -> Result<Vec<crate::models::IssueComment>> {
let path = format!("/{}/-/issues/{}/comments", repo, number);
let mut url = self.inner.url(&path)?;
{
let mut pairs = url.query_pairs_mut();
if let Some(ref v) = query.sort {
pairs.append_pair("sort", v);
}
if let Some(v) = query.page {
pairs.append_pair("page", &v.to_string());
}
if let Some(v) = query.page_size {
pairs.append_pair("page_size", &v.to_string());
}
drop(pairs);
}
self.inner
.execute::<Vec<crate::models::IssueComment>>(Method::GET, url)
.await
}
pub async fn list_issue_labels(
&self,
repo: String,
number: i64,
query: &ListIssueLabelsQuery,
) -> Result<Vec<crate::models::Label>> {
let path = format!("/{}/-/issues/{}/labels", repo, number);
let mut url = self.inner.url(&path)?;
{
let mut pairs = url.query_pairs_mut();
if let Some(v) = query.page {
pairs.append_pair("page", &v.to_string());
}
if let Some(v) = query.page_size {
pairs.append_pair("page_size", &v.to_string());
}
drop(pairs);
}
self.inner
.execute::<Vec<crate::models::Label>>(Method::GET, url)
.await
}
pub async fn list_issues(
&self,
repo: String,
query: &ListIssuesQuery,
) -> Result<Vec<crate::models::Issue>> {
let path = format!("/{}/-/issues", repo);
let mut url = self.inner.url(&path)?;
{
let mut pairs = url.query_pairs_mut();
if let Some(v) = query.page {
pairs.append_pair("page", &v.to_string());
}
if let Some(v) = query.page_size {
pairs.append_pair("page_size", &v.to_string());
}
if let Some(ref v) = query.state {
pairs.append_pair("state", v);
}
if let Some(ref v) = query.keyword {
pairs.append_pair("keyword", v);
}
if let Some(ref v) = query.priority {
pairs.append_pair("priority", v);
}
if let Some(ref v) = query.labels {
pairs.append_pair("labels", v);
}
if let Some(ref v) = query.labels_operator {
pairs.append_pair("labels_operator", v);
}
if let Some(ref v) = query.authors {
pairs.append_pair("authors", v);
}
if let Some(ref v) = query.assignees {
pairs.append_pair("assignees", v);
}
if let Some(ref v) = query.updated_time_begin {
pairs.append_pair("updated_time_begin", v);
}
if let Some(ref v) = query.updated_time_end {
pairs.append_pair("updated_time_end", v);
}
if let Some(ref v) = query.close_time_begin {
pairs.append_pair("close_time_begin", v);
}
if let Some(ref v) = query.close_time_end {
pairs.append_pair("close_time_end", v);
}
if let Some(ref v) = query.order_by {
pairs.append_pair("order_by", v);
}
drop(pairs);
}
self.inner
.execute::<Vec<crate::models::Issue>>(Method::GET, url)
.await
}
pub async fn list_repo_invisible_properties(
&self,
repo: String,
query: &ListRepoInvisiblePropertiesQuery,
) -> Result<Vec<crate::models::RepoProperty>> {
let path = format!("/{}/-/property/invisible", repo);
let mut url = self.inner.url(&path)?;
{
let mut pairs = url.query_pairs_mut();
if let Some(v) = query.page {
pairs.append_pair("page", &v.to_string());
}
if let Some(v) = query.page_size {
pairs.append_pair("page_size", &v.to_string());
}
if let Some(ref v) = query.keyword {
pairs.append_pair("keyword", v);
}
drop(pairs);
}
self.inner
.execute::<Vec<crate::models::RepoProperty>>(Method::GET, url)
.await
}
pub async fn list_repo_visible_properties(
&self,
repo: String,
) -> Result<Vec<crate::models::RepoProperty>> {
let path = format!("/{}/-/property", repo);
let mut url = self.inner.url(&path)?;
self.inner
.execute::<Vec<crate::models::RepoProperty>>(Method::GET, url)
.await
}
pub async fn list_user_issues(
&self,
query: &ListUserIssuesQuery,
) -> Result<Vec<crate::models::UserIssue>> {
let path = "/user/issues".to_string();
let mut url = self.inner.url(&path)?;
{
let mut pairs = url.query_pairs_mut();
if let Some(v) = query.page {
pairs.append_pair("page", &v.to_string());
}
if let Some(v) = query.page_size {
pairs.append_pair("page_size", &v.to_string());
}
if let Some(ref v) = query.filter {
pairs.append_pair("filter", v);
}
if let Some(ref v) = query.state {
pairs.append_pair("state", v);
}
if let Some(ref v) = query.priority {
pairs.append_pair("priority", v);
}
if let Some(ref v) = query.labels {
pairs.append_pair("labels", v);
}
if let Some(ref v) = query.labels_operator {
pairs.append_pair("labels_operator", v);
}
if let Some(ref v) = query.updated_time_begin {
pairs.append_pair("updated_time_begin", v);
}
if let Some(ref v) = query.updated_time_end {
pairs.append_pair("updated_time_end", v);
}
if let Some(ref v) = query.close_time_begin {
pairs.append_pair("close_time_begin", v);
}
if let Some(ref v) = query.close_time_end {
pairs.append_pair("close_time_end", v);
}
if let Some(ref v) = query.order_by {
pairs.append_pair("order_by", v);
}
drop(pairs);
}
self.inner
.execute::<Vec<crate::models::UserIssue>>(Method::GET, url)
.await
}
pub async fn patch_issue_assignees(
&self,
repo: String,
number: String,
body: &crate::models::PatchIssueAssigneesForm,
) -> Result<crate::models::IssueDetail> {
let path = format!("/{}/-/issues/{}/assignees", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueDetail, _>(Method::PATCH, url, body)
.await
}
pub async fn patch_issue_comment(
&self,
repo: String,
number: i64,
comment_id: i64,
body: &crate::models::PatchIssueCommentForm,
) -> Result<crate::models::IssueComment> {
let path = format!("/{}/-/issues/{}/comments/{}", repo, number, comment_id);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueComment, _>(Method::PATCH, url, body)
.await
}
pub async fn post_issue_assignees(
&self,
repo: String,
number: String,
body: &crate::models::PostIssueAssigneesForm,
) -> Result<crate::models::IssueDetail> {
let path = format!("/{}/-/issues/{}/assignees", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueDetail, _>(Method::POST, url, body)
.await
}
pub async fn post_issue_comment(
&self,
repo: String,
number: i64,
body: &crate::models::PostIssueCommentForm,
) -> Result<crate::models::IssueComment> {
let path = format!("/{}/-/issues/{}/comments", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueComment, _>(Method::POST, url, body)
.await
}
pub async fn post_issue_comment_file_asset_upload_url(
&self,
repo: String,
number: i64,
body: &crate::models::PostIssueAssetUploadUrlForm,
) -> Result<crate::models::IssueAssetUploadUrl> {
let path = format!(
"/{}/-/issues/{}/comment-file-asset-upload-url",
repo, number
);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueAssetUploadUrl, _>(Method::POST, url, body)
.await
}
pub async fn post_issue_comment_image_asset_upload_url(
&self,
repo: String,
number: i64,
body: &crate::models::PostIssueAssetUploadUrlForm,
) -> Result<crate::models::IssueAssetUploadUrl> {
let path = format!(
"/{}/-/issues/{}/comment-image-asset-upload-url",
repo, number
);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueAssetUploadUrl, _>(Method::POST, url, body)
.await
}
pub async fn post_issue_labels(
&self,
repo: String,
number: i64,
body: &crate::models::PostIssueLabelsForm,
) -> Result<crate::models::Label> {
let path = format!("/{}/-/issues/{}/labels", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::Label, _>(Method::POST, url, body)
.await
}
pub async fn put_issue_labels(
&self,
repo: String,
number: i64,
body: &crate::models::PutIssueLabelsForm,
) -> Result<crate::models::Label> {
let path = format!("/{}/-/issues/{}/labels", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::Label, _>(Method::PUT, url, body)
.await
}
pub async fn update_issue(
&self,
repo: String,
number: i64,
body: &crate::models::PatchIssueForm,
) -> Result<crate::models::IssueDetail> {
let path = format!("/{}/-/issues/{}", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssueDetail, _>(Method::PATCH, url, body)
.await
}
pub async fn update_issue_properties(
&self,
repo: String,
number: i64,
body: &crate::models::IssuePropertiesForm,
) -> Result<crate::models::IssuePropertyUpdateResult> {
let path = format!("/{}/-/issues/{}/property", repo, number);
let mut url = self.inner.url(&path)?;
self.inner
.execute_with_body::<crate::models::IssuePropertyUpdateResult, _>(
Method::PATCH,
url,
body,
)
.await
}
}
#[derive(Debug, Clone, Default, Serialize)]
#[non_exhaustive]
pub struct ListIssueActivitiesQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page_size: Option<i64>,
}
impl ListIssueActivitiesQuery {
pub fn new() -> Self {
Self::default()
}
pub fn page(mut self, v: impl Into<i64>) -> Self {
self.page = Some(v.into());
self
}
pub fn page_size(mut self, v: impl Into<i64>) -> Self {
self.page_size = Some(v.into());
self
}
}
#[derive(Debug, Clone, Default, Serialize)]
#[non_exhaustive]
pub struct ListIssueCommentsQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sort: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page_size: Option<i64>,
}
impl ListIssueCommentsQuery {
pub fn new() -> Self {
Self::default()
}
pub fn sort(mut self, v: impl Into<String>) -> Self {
self.sort = Some(v.into());
self
}
pub fn page(mut self, v: impl Into<i64>) -> Self {
self.page = Some(v.into());
self
}
pub fn page_size(mut self, v: impl Into<i64>) -> Self {
self.page_size = Some(v.into());
self
}
}
#[derive(Debug, Clone, Default, Serialize)]
#[non_exhaustive]
pub struct ListIssueLabelsQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page_size: Option<i64>,
}
impl ListIssueLabelsQuery {
pub fn new() -> Self {
Self::default()
}
pub fn page(mut self, v: impl Into<i64>) -> Self {
self.page = Some(v.into());
self
}
pub fn page_size(mut self, v: impl Into<i64>) -> Self {
self.page_size = Some(v.into());
self
}
}
#[derive(Debug, Clone, Default, Serialize)]
#[non_exhaustive]
pub struct ListIssuesQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page_size: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub keyword: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub priority: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub labels: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub labels_operator: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub authors: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub assignees: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated_time_begin: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated_time_end: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub close_time_begin: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub close_time_end: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub order_by: Option<String>,
}
impl ListIssuesQuery {
pub fn new() -> Self {
Self::default()
}
pub fn page(mut self, v: impl Into<i64>) -> Self {
self.page = Some(v.into());
self
}
pub fn page_size(mut self, v: impl Into<i64>) -> Self {
self.page_size = Some(v.into());
self
}
pub fn state(mut self, v: impl Into<String>) -> Self {
self.state = Some(v.into());
self
}
pub fn keyword(mut self, v: impl Into<String>) -> Self {
self.keyword = Some(v.into());
self
}
pub fn priority(mut self, v: impl Into<String>) -> Self {
self.priority = Some(v.into());
self
}
pub fn labels(mut self, v: impl Into<String>) -> Self {
self.labels = Some(v.into());
self
}
pub fn labels_operator(mut self, v: impl Into<String>) -> Self {
self.labels_operator = Some(v.into());
self
}
pub fn authors(mut self, v: impl Into<String>) -> Self {
self.authors = Some(v.into());
self
}
pub fn assignees(mut self, v: impl Into<String>) -> Self {
self.assignees = Some(v.into());
self
}
pub fn updated_time_begin(mut self, v: impl Into<String>) -> Self {
self.updated_time_begin = Some(v.into());
self
}
pub fn updated_time_end(mut self, v: impl Into<String>) -> Self {
self.updated_time_end = Some(v.into());
self
}
pub fn close_time_begin(mut self, v: impl Into<String>) -> Self {
self.close_time_begin = Some(v.into());
self
}
pub fn close_time_end(mut self, v: impl Into<String>) -> Self {
self.close_time_end = Some(v.into());
self
}
pub fn order_by(mut self, v: impl Into<String>) -> Self {
self.order_by = Some(v.into());
self
}
}
#[derive(Debug, Clone, Default, Serialize)]
#[non_exhaustive]
pub struct ListRepoInvisiblePropertiesQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page_size: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub keyword: Option<String>,
}
impl ListRepoInvisiblePropertiesQuery {
pub fn new() -> Self {
Self::default()
}
pub fn page(mut self, v: impl Into<i64>) -> Self {
self.page = Some(v.into());
self
}
pub fn page_size(mut self, v: impl Into<i64>) -> Self {
self.page_size = Some(v.into());
self
}
pub fn keyword(mut self, v: impl Into<String>) -> Self {
self.keyword = Some(v.into());
self
}
}
#[derive(Debug, Clone, Default, Serialize)]
#[non_exhaustive]
pub struct ListUserIssuesQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page_size: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filter: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub priority: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub labels: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub labels_operator: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated_time_begin: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated_time_end: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub close_time_begin: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub close_time_end: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub order_by: Option<String>,
}
impl ListUserIssuesQuery {
pub fn new() -> Self {
Self::default()
}
pub fn page(mut self, v: impl Into<i64>) -> Self {
self.page = Some(v.into());
self
}
pub fn page_size(mut self, v: impl Into<i64>) -> Self {
self.page_size = Some(v.into());
self
}
pub fn filter(mut self, v: impl Into<String>) -> Self {
self.filter = Some(v.into());
self
}
pub fn state(mut self, v: impl Into<String>) -> Self {
self.state = Some(v.into());
self
}
pub fn priority(mut self, v: impl Into<String>) -> Self {
self.priority = Some(v.into());
self
}
pub fn labels(mut self, v: impl Into<String>) -> Self {
self.labels = Some(v.into());
self
}
pub fn labels_operator(mut self, v: impl Into<String>) -> Self {
self.labels_operator = Some(v.into());
self
}
pub fn updated_time_begin(mut self, v: impl Into<String>) -> Self {
self.updated_time_begin = Some(v.into());
self
}
pub fn updated_time_end(mut self, v: impl Into<String>) -> Self {
self.updated_time_end = Some(v.into());
self
}
pub fn close_time_begin(mut self, v: impl Into<String>) -> Self {
self.close_time_begin = Some(v.into());
self
}
pub fn close_time_end(mut self, v: impl Into<String>) -> Self {
self.close_time_end = Some(v.into());
self
}
pub fn order_by(mut self, v: impl Into<String>) -> Self {
self.order_by = Some(v.into());
self
}
}