#![allow(
clippy::all
)]
use serde::Deserialize;
use roctokit::adapters::{AdapterError, Client, GitHubRequest, GitHubResponseExt};
use crate::models::*;
use super::PerPage;
use std::collections::HashMap;
use serde_json::value::Value;
pub struct Campaigns<'api, C: Client> where AdapterError: From<<C as Client>::Err> {
client: &'api C
}
pub fn new<C: Client>(client: &C) -> Campaigns<C> where AdapterError: From<<C as Client>::Err> {
Campaigns { client }
}
#[derive(Debug, thiserror::Error)]
pub enum CampaignsCreateCampaignError {
#[error("Bad Request")]
Status400(BasicError),
#[error("Resource not found")]
Status404(BasicError),
#[error("Unprocessable Entity")]
Status422(BasicError),
#[error("Too Many Requests")]
Status429,
#[error("Service unavailable")]
Status503(GetBillingGetGithubBillingUsageReportUserResponse503),
#[error("Status code: {}", code)]
Generic { code: u16 },
}
impl From<CampaignsCreateCampaignError> for AdapterError {
fn from(err: CampaignsCreateCampaignError) -> Self {
let (description, status_code) = match err {
CampaignsCreateCampaignError::Status400(_) => (String::from("Bad Request"), 400),
CampaignsCreateCampaignError::Status404(_) => (String::from("Resource not found"), 404),
CampaignsCreateCampaignError::Status422(_) => (String::from("Unprocessable Entity"), 422),
CampaignsCreateCampaignError::Status429 => (String::from("Too Many Requests"), 429),
CampaignsCreateCampaignError::Status503(_) => (String::from("Service unavailable"), 503),
CampaignsCreateCampaignError::Generic { code } => (String::from("Generic"), code)
};
Self::Endpoint {
description,
status_code,
source: Some(Box::new(err))
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum CampaignsDeleteCampaignError {
#[error("Resource not found")]
Status404(BasicError),
#[error("Service unavailable")]
Status503(GetBillingGetGithubBillingUsageReportUserResponse503),
#[error("Status code: {}", code)]
Generic { code: u16 },
}
impl From<CampaignsDeleteCampaignError> for AdapterError {
fn from(err: CampaignsDeleteCampaignError) -> Self {
let (description, status_code) = match err {
CampaignsDeleteCampaignError::Status404(_) => (String::from("Resource not found"), 404),
CampaignsDeleteCampaignError::Status503(_) => (String::from("Service unavailable"), 503),
CampaignsDeleteCampaignError::Generic { code } => (String::from("Generic"), code)
};
Self::Endpoint {
description,
status_code,
source: Some(Box::new(err))
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum CampaignsGetCampaignSummaryError {
#[error("Resource not found")]
Status404(BasicError),
#[error("Unprocessable Entity")]
Status422(BasicError),
#[error("Service unavailable")]
Status503(GetBillingGetGithubBillingUsageReportUserResponse503),
#[error("Status code: {}", code)]
Generic { code: u16 },
}
impl From<CampaignsGetCampaignSummaryError> for AdapterError {
fn from(err: CampaignsGetCampaignSummaryError) -> Self {
let (description, status_code) = match err {
CampaignsGetCampaignSummaryError::Status404(_) => (String::from("Resource not found"), 404),
CampaignsGetCampaignSummaryError::Status422(_) => (String::from("Unprocessable Entity"), 422),
CampaignsGetCampaignSummaryError::Status503(_) => (String::from("Service unavailable"), 503),
CampaignsGetCampaignSummaryError::Generic { code } => (String::from("Generic"), code)
};
Self::Endpoint {
description,
status_code,
source: Some(Box::new(err))
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum CampaignsListOrgCampaignsError {
#[error("Resource not found")]
Status404(BasicError),
#[error("Service unavailable")]
Status503(GetBillingGetGithubBillingUsageReportUserResponse503),
#[error("Status code: {}", code)]
Generic { code: u16 },
}
impl From<CampaignsListOrgCampaignsError> for AdapterError {
fn from(err: CampaignsListOrgCampaignsError) -> Self {
let (description, status_code) = match err {
CampaignsListOrgCampaignsError::Status404(_) => (String::from("Resource not found"), 404),
CampaignsListOrgCampaignsError::Status503(_) => (String::from("Service unavailable"), 503),
CampaignsListOrgCampaignsError::Generic { code } => (String::from("Generic"), code)
};
Self::Endpoint {
description,
status_code,
source: Some(Box::new(err))
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum CampaignsUpdateCampaignError {
#[error("Bad Request")]
Status400(BasicError),
#[error("Resource not found")]
Status404(BasicError),
#[error("Unprocessable Entity")]
Status422(BasicError),
#[error("Service unavailable")]
Status503(GetBillingGetGithubBillingUsageReportUserResponse503),
#[error("Status code: {}", code)]
Generic { code: u16 },
}
impl From<CampaignsUpdateCampaignError> for AdapterError {
fn from(err: CampaignsUpdateCampaignError) -> Self {
let (description, status_code) = match err {
CampaignsUpdateCampaignError::Status400(_) => (String::from("Bad Request"), 400),
CampaignsUpdateCampaignError::Status404(_) => (String::from("Resource not found"), 404),
CampaignsUpdateCampaignError::Status422(_) => (String::from("Unprocessable Entity"), 422),
CampaignsUpdateCampaignError::Status503(_) => (String::from("Service unavailable"), 503),
CampaignsUpdateCampaignError::Generic { code } => (String::from("Generic"), code)
};
Self::Endpoint {
description,
status_code,
source: Some(Box::new(err))
}
}
}
#[derive(Default, Serialize)]
pub struct CampaignsListOrgCampaignsParams<'req> {
page: Option<u16>,
per_page: Option<u16>,
direction: Option<&'req str>,
state: Option<CampaignState>,
sort: Option<&'req str>
}
impl<'req> CampaignsListOrgCampaignsParams<'req> {
pub fn new() -> Self {
Self::default()
}
pub fn page(self, page: u16) -> Self {
Self {
page: Some(page),
per_page: self.per_page,
direction: self.direction,
state: self.state,
sort: self.sort,
}
}
pub fn per_page(self, per_page: u16) -> Self {
Self {
page: self.page,
per_page: Some(per_page),
direction: self.direction,
state: self.state,
sort: self.sort,
}
}
pub fn direction(self, direction: &'req str) -> Self {
Self {
page: self.page,
per_page: self.per_page,
direction: Some(direction),
state: self.state,
sort: self.sort,
}
}
pub fn state(self, state: CampaignState) -> Self {
Self {
page: self.page,
per_page: self.per_page,
direction: self.direction,
state: Some(state),
sort: self.sort,
}
}
pub fn sort(self, sort: &'req str) -> Self {
Self {
page: self.page,
per_page: self.per_page,
direction: self.direction,
state: self.state,
sort: Some(sort),
}
}
}
impl<'enc> From<&'enc PerPage> for CampaignsListOrgCampaignsParams<'enc> {
fn from(per_page: &'enc PerPage) -> Self {
Self {
per_page: Some(per_page.per_page),
page: Some(per_page.page),
..Default::default()
}
}
}
impl<'api, C: Client> Campaigns<'api, C> where AdapterError: From<<C as Client>::Err> {
pub async fn create_campaign_async(&self, org: &str, body: PostCampaignsCreateCampaign) -> Result<CampaignSummary, AdapterError> {
let request_uri = format!("{}/orgs/{}/campaigns", super::GITHUB_BASE_API_URL, org);
let req = GitHubRequest {
uri: request_uri,
body: Some(C::from_json::<PostCampaignsCreateCampaign>(body)?),
method: "POST",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch_async(request).await?;
if github_response.is_success() {
Ok(github_response.to_json_async().await?)
} else {
match github_response.status_code() {
400 => Err(CampaignsCreateCampaignError::Status400(github_response.to_json_async().await?).into()),
404 => Err(CampaignsCreateCampaignError::Status404(github_response.to_json_async().await?).into()),
422 => Err(CampaignsCreateCampaignError::Status422(github_response.to_json_async().await?).into()),
429 => Err(CampaignsCreateCampaignError::Status429.into()),
503 => Err(CampaignsCreateCampaignError::Status503(github_response.to_json_async().await?).into()),
code => Err(CampaignsCreateCampaignError::Generic { code }.into()),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
pub fn create_campaign(&self, org: &str, body: PostCampaignsCreateCampaign) -> Result<CampaignSummary, AdapterError> {
let request_uri = format!("{}/orgs/{}/campaigns", super::GITHUB_BASE_API_URL, org);
let req = GitHubRequest {
uri: request_uri,
body: Some(C::from_json::<PostCampaignsCreateCampaign>(body)?),
method: "POST",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch(request)?;
if github_response.is_success() {
Ok(github_response.to_json()?)
} else {
match github_response.status_code() {
400 => Err(CampaignsCreateCampaignError::Status400(github_response.to_json()?).into()),
404 => Err(CampaignsCreateCampaignError::Status404(github_response.to_json()?).into()),
422 => Err(CampaignsCreateCampaignError::Status422(github_response.to_json()?).into()),
429 => Err(CampaignsCreateCampaignError::Status429.into()),
503 => Err(CampaignsCreateCampaignError::Status503(github_response.to_json()?).into()),
code => Err(CampaignsCreateCampaignError::Generic { code }.into()),
}
}
}
pub async fn delete_campaign_async(&self, org: &str, campaign_number: i32) -> Result<(), AdapterError> {
let request_uri = format!("{}/orgs/{}/campaigns/{}", super::GITHUB_BASE_API_URL, org, campaign_number);
let req = GitHubRequest {
uri: request_uri,
body: None::<C::Body>,
method: "DELETE",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch_async(request).await?;
if github_response.is_success() {
Ok(())
} else {
match github_response.status_code() {
404 => Err(CampaignsDeleteCampaignError::Status404(github_response.to_json_async().await?).into()),
503 => Err(CampaignsDeleteCampaignError::Status503(github_response.to_json_async().await?).into()),
code => Err(CampaignsDeleteCampaignError::Generic { code }.into()),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
pub fn delete_campaign(&self, org: &str, campaign_number: i32) -> Result<(), AdapterError> {
let request_uri = format!("{}/orgs/{}/campaigns/{}", super::GITHUB_BASE_API_URL, org, campaign_number);
let req = GitHubRequest {
uri: request_uri,
body: None,
method: "DELETE",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch(request)?;
if github_response.is_success() {
Ok(())
} else {
match github_response.status_code() {
404 => Err(CampaignsDeleteCampaignError::Status404(github_response.to_json()?).into()),
503 => Err(CampaignsDeleteCampaignError::Status503(github_response.to_json()?).into()),
code => Err(CampaignsDeleteCampaignError::Generic { code }.into()),
}
}
}
pub async fn get_campaign_summary_async(&self, org: &str, campaign_number: i32) -> Result<CampaignSummary, AdapterError> {
let request_uri = format!("{}/orgs/{}/campaigns/{}", super::GITHUB_BASE_API_URL, org, campaign_number);
let req = GitHubRequest {
uri: request_uri,
body: None::<C::Body>,
method: "GET",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch_async(request).await?;
if github_response.is_success() {
Ok(github_response.to_json_async().await?)
} else {
match github_response.status_code() {
404 => Err(CampaignsGetCampaignSummaryError::Status404(github_response.to_json_async().await?).into()),
422 => Err(CampaignsGetCampaignSummaryError::Status422(github_response.to_json_async().await?).into()),
503 => Err(CampaignsGetCampaignSummaryError::Status503(github_response.to_json_async().await?).into()),
code => Err(CampaignsGetCampaignSummaryError::Generic { code }.into()),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
pub fn get_campaign_summary(&self, org: &str, campaign_number: i32) -> Result<CampaignSummary, AdapterError> {
let request_uri = format!("{}/orgs/{}/campaigns/{}", super::GITHUB_BASE_API_URL, org, campaign_number);
let req = GitHubRequest {
uri: request_uri,
body: None,
method: "GET",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch(request)?;
if github_response.is_success() {
Ok(github_response.to_json()?)
} else {
match github_response.status_code() {
404 => Err(CampaignsGetCampaignSummaryError::Status404(github_response.to_json()?).into()),
422 => Err(CampaignsGetCampaignSummaryError::Status422(github_response.to_json()?).into()),
503 => Err(CampaignsGetCampaignSummaryError::Status503(github_response.to_json()?).into()),
code => Err(CampaignsGetCampaignSummaryError::Generic { code }.into()),
}
}
}
pub async fn list_org_campaigns_async(&self, org: &str, query_params: Option<impl Into<CampaignsListOrgCampaignsParams<'api>>>) -> Result<Vec<CampaignSummary>, AdapterError> {
let mut request_uri = format!("{}/orgs/{}/campaigns", super::GITHUB_BASE_API_URL, org);
if let Some(params) = query_params {
request_uri.push_str("?");
request_uri.push_str(&serde_urlencoded::to_string(params.into())?);
}
let req = GitHubRequest {
uri: request_uri,
body: None::<C::Body>,
method: "GET",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch_async(request).await?;
if github_response.is_success() {
Ok(github_response.to_json_async().await?)
} else {
match github_response.status_code() {
404 => Err(CampaignsListOrgCampaignsError::Status404(github_response.to_json_async().await?).into()),
503 => Err(CampaignsListOrgCampaignsError::Status503(github_response.to_json_async().await?).into()),
code => Err(CampaignsListOrgCampaignsError::Generic { code }.into()),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
pub fn list_org_campaigns(&self, org: &str, query_params: Option<impl Into<CampaignsListOrgCampaignsParams<'api>>>) -> Result<Vec<CampaignSummary>, AdapterError> {
let mut request_uri = format!("{}/orgs/{}/campaigns", super::GITHUB_BASE_API_URL, org);
if let Some(params) = query_params {
request_uri.push_str("?");
let qp: CampaignsListOrgCampaignsParams = params.into();
request_uri.push_str(&serde_urlencoded::to_string(qp)?);
}
let req = GitHubRequest {
uri: request_uri,
body: None,
method: "GET",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch(request)?;
if github_response.is_success() {
Ok(github_response.to_json()?)
} else {
match github_response.status_code() {
404 => Err(CampaignsListOrgCampaignsError::Status404(github_response.to_json()?).into()),
503 => Err(CampaignsListOrgCampaignsError::Status503(github_response.to_json()?).into()),
code => Err(CampaignsListOrgCampaignsError::Generic { code }.into()),
}
}
}
pub async fn update_campaign_async(&self, org: &str, campaign_number: i32, body: PatchCampaignsUpdateCampaign) -> Result<CampaignSummary, AdapterError> {
let request_uri = format!("{}/orgs/{}/campaigns/{}", super::GITHUB_BASE_API_URL, org, campaign_number);
let req = GitHubRequest {
uri: request_uri,
body: Some(C::from_json::<PatchCampaignsUpdateCampaign>(body)?),
method: "PATCH",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch_async(request).await?;
if github_response.is_success() {
Ok(github_response.to_json_async().await?)
} else {
match github_response.status_code() {
400 => Err(CampaignsUpdateCampaignError::Status400(github_response.to_json_async().await?).into()),
404 => Err(CampaignsUpdateCampaignError::Status404(github_response.to_json_async().await?).into()),
422 => Err(CampaignsUpdateCampaignError::Status422(github_response.to_json_async().await?).into()),
503 => Err(CampaignsUpdateCampaignError::Status503(github_response.to_json_async().await?).into()),
code => Err(CampaignsUpdateCampaignError::Generic { code }.into()),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
pub fn update_campaign(&self, org: &str, campaign_number: i32, body: PatchCampaignsUpdateCampaign) -> Result<CampaignSummary, AdapterError> {
let request_uri = format!("{}/orgs/{}/campaigns/{}", super::GITHUB_BASE_API_URL, org, campaign_number);
let req = GitHubRequest {
uri: request_uri,
body: Some(C::from_json::<PatchCampaignsUpdateCampaign>(body)?),
method: "PATCH",
headers: vec![]
};
let request = self.client.build(req)?;
let github_response = self.client.fetch(request)?;
if github_response.is_success() {
Ok(github_response.to_json()?)
} else {
match github_response.status_code() {
400 => Err(CampaignsUpdateCampaignError::Status400(github_response.to_json()?).into()),
404 => Err(CampaignsUpdateCampaignError::Status404(github_response.to_json()?).into()),
422 => Err(CampaignsUpdateCampaignError::Status422(github_response.to_json()?).into()),
503 => Err(CampaignsUpdateCampaignError::Status503(github_response.to_json()?).into()),
code => Err(CampaignsUpdateCampaignError::Generic { code }.into()),
}
}
}
}