use http::StatusCode;
use crate::models::interaction_limits::{
InteractionLimit, InteractionLimitExpiry, InteractionLimitType,
};
use crate::models::{interaction_limits, Followee, Follower, UpdateUserProfile};
use crate::{
models::{
self, apps::InstallationRepositories, gists::Gist, orgs::MembershipInvitation,
teams::FullTeam, Installation, InstallationId, Repository, RepositoryId,
},
params, Octocrab, Page, Result,
};
use chrono::{DateTime, Utc};
pub use crate::api::activity::watching::ListUserSubscriptionsBuilder;
pub struct CurrentAuthHandler<'octo> {
crab: &'octo Octocrab,
}
impl<'octo> CurrentAuthHandler<'octo> {
pub(crate) fn new(crab: &'octo Octocrab) -> Self {
Self { crab }
}
pub async fn user(&self) -> Result<models::Author> {
self.crab.get("/user", None::<&()>).await
}
pub async fn update_user(&self, new_data: UpdateUserProfile) -> Result<models::Author> {
let params = serde_json::to_value(new_data).unwrap();
self.crab.patch("/user", Some(¶ms)).await
}
pub fn packages(&self) -> crate::api::packages::PackagesHandler<'octo> {
crate::api::packages::PackagesHandler::new(
self.crab,
crate::api::packages::PackagesOwner::AuthenticatedUser,
)
}
pub fn codespaces(&self) -> crate::api::codespaces::CodespacesHandler<'octo> {
crate::api::codespaces::CodespacesHandler::new(self.crab)
}
pub fn migrations(&self) -> crate::api::migrations::MigrationsHandler<'octo> {
crate::api::migrations::MigrationsHandler::new(self.crab)
}
pub async fn app(&self) -> Result<models::App> {
self.crab.get("/app", None::<&()>).await
}
pub fn list_repos_starred_by_authenticated_user(&self) -> ListStarredReposBuilder<'octo> {
ListStarredReposBuilder::new(self.crab)
}
pub fn list_repos_watched_by_authenticated_user(&self) -> ListUserSubscriptionsBuilder<'octo> {
ListUserSubscriptionsBuilder::new(self.crab, "/user/subscriptions")
}
pub fn list_watched_repos(&self) -> ListUserSubscriptionsBuilder<'octo> {
self.list_repos_watched_by_authenticated_user()
}
pub async fn is_starred(&self, owner: impl AsRef<str>, repo: impl AsRef<str>) -> Result<bool> {
let route = format!("/user/starred/{}/{}", owner.as_ref(), repo.as_ref());
let response = self.crab._get(route).await?;
match response.status() {
StatusCode::NO_CONTENT => Ok(true),
StatusCode::NOT_FOUND => Ok(false),
_ => Err(crate::map_github_error(response).await.unwrap_err()),
}
}
pub async fn star_repo(&self, owner: impl AsRef<str>, repo: impl AsRef<str>) -> Result<()> {
let route = format!("/user/starred/{}/{}", owner.as_ref(), repo.as_ref());
let response = self.crab._put(route, None::<&()>).await?;
if !response.status().is_success() {
return Err(crate::map_github_error(response).await.unwrap_err());
}
Ok(())
}
pub async fn unstar_repo(&self, owner: impl AsRef<str>, repo: impl AsRef<str>) -> Result<()> {
let route = format!("/user/starred/{}/{}", owner.as_ref(), repo.as_ref());
let response = self.crab._delete(route, None::<&()>).await?;
if !response.status().is_success() {
return Err(crate::map_github_error(response).await.unwrap_err());
}
Ok(())
}
pub fn list_repos_for_authenticated_user(&self) -> ListReposForAuthenticatedUserBuilder<'octo> {
ListReposForAuthenticatedUserBuilder::new(self.crab)
}
pub fn list_gists_for_authenticated_user(&self) -> ListGistsForAuthenticatedUserBuilder<'octo> {
ListGistsForAuthenticatedUserBuilder::new(self.crab)
}
pub fn list_gists_starred_by_authenticated_user(&self) -> ListStarredGistsBuilder<'octo> {
ListStarredGistsBuilder::new(self.crab)
}
pub fn list_issues_for_authenticated_user(&self) -> ListUserIssuesBuilder<'octo, '_> {
ListUserIssuesBuilder::new(self.crab)
}
pub fn list_issues(&self) -> ListUserIssuesBuilder<'octo, '_> {
self.list_issues_for_authenticated_user()
}
pub fn list_all_issues(&self) -> ListAllIssuesBuilder<'octo, '_> {
ListAllIssuesBuilder::new(self.crab)
}
pub fn list_app_installations_accessible_to_user(
&self,
) -> ListAppInstallationsAccessibleToUserBuilder<'octo> {
ListAppInstallationsAccessibleToUserBuilder::new(self.crab)
}
pub fn installation_repositories(
&self,
installation_id: impl Into<InstallationId>,
) -> ListUserInstallationRepositoriesBuilder<'octo> {
ListUserInstallationRepositoriesBuilder::new(self.crab, installation_id.into())
}
pub async fn add_repository_to_installation(
&self,
installation_id: impl Into<InstallationId>,
repository_id: impl Into<RepositoryId>,
) -> Result<()> {
let route = format!(
"/user/installations/{}/repositories/{}",
installation_id.into(),
repository_id.into()
);
let resp = self.crab._put(route, None::<&()>).await?;
crate::map_github_error(resp).await?;
Ok(())
}
pub async fn remove_repository_from_installation(
&self,
installation_id: impl Into<InstallationId>,
repository_id: impl Into<RepositoryId>,
) -> Result<()> {
let route = format!(
"/user/installations/{}/repositories/{}",
installation_id.into(),
repository_id.into()
);
let resp = self.crab._delete(route, None::<&()>).await?;
crate::map_github_error(resp).await?;
Ok(())
}
pub fn marketplace_purchases(
&self,
) -> crate::api::marketplace::ListUserMarketplacePurchasesBuilder<'octo> {
crate::api::marketplace::ListUserMarketplacePurchasesBuilder::new(self.crab, false)
}
pub fn marketplace_purchases_stubbed(
&self,
) -> crate::api::marketplace::ListUserMarketplacePurchasesBuilder<'octo> {
crate::api::marketplace::ListUserMarketplacePurchasesBuilder::new(self.crab, true)
}
pub async fn revoke_installation_token(&self) -> Result<()> {
let resp = self
.crab
._delete("/installation/token", None::<&()>)
.await?;
crate::map_github_error(resp).await?;
Ok(())
}
pub fn list_org_memberships_for_authenticated_user(
&self,
) -> ListOrgMembershipsForAuthenticatedUserBuilder<'octo> {
ListOrgMembershipsForAuthenticatedUserBuilder::new(self.crab)
}
pub fn list_orgs(&self) -> ListUserOrgsBuilder<'octo> {
ListUserOrgsBuilder::new(self.crab, "/user/orgs")
}
pub async fn get_org_membership(
&self,
org: impl AsRef<str>,
) -> Result<crate::models::orgs::OrgMembership> {
let route = format!("/user/memberships/orgs/{org}", org = org.as_ref());
self.crab.get(route, None::<&()>).await
}
pub async fn update_org_membership(
&self,
org: impl AsRef<str>,
state: crate::models::orgs::OrgMembershipState,
) -> Result<crate::models::orgs::OrgMembership> {
let route = format!("/user/memberships/orgs/{org}", org = org.as_ref());
let body = serde_json::json!({ "state": state });
self.crab.patch(route, Some(&body)).await
}
pub fn list_all_teams_for_auth_user(&self) -> ListAllTeamsForAuthUserBuilder<'octo> {
ListAllTeamsForAuthUserBuilder::new(self.crab)
}
pub async fn get_interaction_restrictions(
&self,
) -> crate::Result<interaction_limits::InteractionLimit> {
let route = "/user/interaction-limits";
self.crab.get(route, None::<&()>).await
}
pub async fn set_interaction_restrictions(
&self,
limit_type: InteractionLimitType,
expiry: InteractionLimitExpiry,
) -> crate::Result<InteractionLimit> {
let route = "/user/interaction-limits";
let body = serde_json::json!({
"limit": limit_type,
"expiry": expiry,
});
self.crab.put(route, Some(&body)).await
}
pub async fn remove_interaction_restrictions(&self) -> crate::Result<()> {
let route = "/user/interaction-limits";
let response = self.crab._delete(route, None::<&()>).await?;
crate::map_github_error(response).await.map(drop)
}
pub fn follows(&self) -> ListCurrentUserFollowingBuilder<'octo> {
ListCurrentUserFollowingBuilder::new(self.crab)
}
pub async fn is_following(&self, username: impl AsRef<str>) -> crate::Result<bool> {
let route = format!("/user/following/{}", username.as_ref());
let response = self.crab._get(route).await?;
match response.status() {
StatusCode::NO_CONTENT => Ok(true),
StatusCode::NOT_FOUND => Ok(false),
_ => {
crate::map_github_error(response).await?;
Ok(false)
}
}
}
pub async fn follow(&self, username: impl AsRef<str>) -> crate::Result<()> {
let route = format!("/user/following/{}", username.as_ref());
let uri = self.crab.parameterized_uri(route, None::<&()>)?;
let response = self.crab._put(uri, None::<&()>).await?;
crate::map_github_error(response).await.map(drop)
}
pub async fn unfollow(&self, username: impl AsRef<str>) -> crate::Result<()> {
let route = format!("/user/following/{}", username.as_ref());
let response = self.crab._delete(route, None::<&()>).await?;
crate::map_github_error(response).await.map(drop)
}
pub fn list_followers(&self) -> ListCurrentUserFollowersBuilder<'octo> {
ListCurrentUserFollowersBuilder::new(self.crab)
}
pub fn repository_invitations(&self) -> UserRepoInvitationsHandler<'octo> {
UserRepoInvitationsHandler::new(self.crab)
}
pub fn list_repository_invitations(&self) -> ListUserRepoInvitationsBuilder<'octo> {
ListUserRepoInvitationsBuilder::new(self.crab)
}
pub async fn accept_repository_invitation(
&self,
invitation_id: impl Into<crate::models::InvitationId>,
) -> Result<()> {
let route = format!("/user/repository_invitations/{}", invitation_id.into());
let response = self.crab._patch(route, None::<&()>).await?;
if response.status() != http::StatusCode::NO_CONTENT {
return Err(crate::map_github_error(response).await.unwrap_err());
}
Ok(())
}
pub async fn decline_repository_invitation(
&self,
invitation_id: impl Into<crate::models::InvitationId>,
) -> Result<()> {
let route = format!("/user/repository_invitations/{}", invitation_id.into());
let response = self.crab._delete(route, None::<&()>).await?;
if response.status() != http::StatusCode::NO_CONTENT {
return Err(crate::map_github_error(response).await.unwrap_err());
}
Ok(())
}
}
#[derive(serde::Serialize)]
pub struct ListStarredReposBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
sort: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
direction: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u8>,
}
impl<'octo> ListStarredReposBuilder<'octo> {
fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
sort: None,
direction: None,
per_page: None,
page: None,
}
}
pub fn sort(mut self, sort: impl Into<String>) -> Self {
self.sort = Some(sort.into());
self
}
pub fn direction(mut self, direction: impl Into<String>) -> Self {
self.direction = Some(direction.into());
self
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u8>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> crate::Result<Page<Repository>> {
self.crab.get("/user/starred", Some(&self)).await
}
}
#[derive(serde::Serialize)]
pub struct ListReposForAuthenticatedUserBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
visibility: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
affiliation: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
sort: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
direction: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
since: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
before: Option<DateTime<Utc>>,
}
impl<'octo> ListReposForAuthenticatedUserBuilder<'octo> {
fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
visibility: None,
affiliation: None,
r#type: None,
sort: None,
direction: None,
per_page: None,
page: None,
since: None,
before: None,
}
}
pub fn visibility(mut self, visibility: impl Into<String>) -> Self {
self.visibility = Some(visibility.into());
self
}
pub fn affiliation(mut self, affiliation: impl Into<String>) -> Self {
self.affiliation = Some(affiliation.into());
self
}
pub fn type_(mut self, type_: impl Into<String>) -> Self {
self.r#type = Some(type_.into());
self
}
pub fn sort(mut self, sort: impl Into<String>) -> Self {
self.sort = Some(sort.into());
self
}
pub fn direction(mut self, direction: impl Into<String>) -> Self {
self.direction = Some(direction.into());
self
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u8>) -> Self {
self.page = Some(page.into());
self
}
pub fn since(mut self, since: impl Into<DateTime<Utc>>) -> Self {
self.since = Some(since.into());
self
}
pub fn before(mut self, before: impl Into<DateTime<Utc>>) -> Self {
self.before = Some(before.into());
self
}
pub async fn send(self) -> crate::Result<Page<Repository>> {
self.crab.get("/user/repos", (&self).into()).await
}
}
#[derive(serde::Serialize)]
pub struct ListGistsForAuthenticatedUserBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
since: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo> ListGistsForAuthenticatedUserBuilder<'octo> {
pub fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
since: None,
per_page: None,
page: None,
}
}
pub fn since(mut self, last_updated: DateTime<Utc>) -> Self {
self.since = Some(last_updated);
self
}
pub fn per_page(mut self, count: u8) -> Self {
self.per_page = Some(count);
self
}
pub fn page(mut self, page_num: u32) -> Self {
self.page = Some(page_num);
self
}
pub async fn send(self) -> crate::Result<Page<Gist>> {
self.crab.get("/gists", Some(&self)).await
}
}
#[derive(serde::Serialize)]
pub struct ListStarredGistsBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
since: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo> ListStarredGistsBuilder<'octo> {
pub fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
since: None,
per_page: None,
page: None,
}
}
pub fn since(mut self, last_updated: DateTime<Utc>) -> Self {
self.since = Some(last_updated);
self
}
pub fn page(mut self, page_num: u32) -> Self {
self.page = Some(page_num);
self
}
pub fn per_page(mut self, count: u8) -> Self {
self.per_page = Some(count);
self
}
pub async fn send(self) -> crate::Result<Page<Gist>> {
self.crab.get("/gists/starred", Some(&self)).await
}
}
#[derive(serde::Serialize)]
pub struct ListOrgMembershipsForAuthenticatedUserBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u8>,
}
impl<'octo> ListOrgMembershipsForAuthenticatedUserBuilder<'octo> {
fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
per_page: None,
page: None,
}
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u8>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> crate::Result<Page<MembershipInvitation>> {
self.crab
.get("/user/memberships/orgs", (&self).into())
.await
}
}
#[derive(serde::Serialize)]
pub struct ListAppInstallationsAccessibleToUserBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u8>,
}
impl<'octo> ListAppInstallationsAccessibleToUserBuilder<'octo> {
fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
per_page: None,
page: None,
}
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u8>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> crate::Result<Page<Installation>> {
self.crab.get("/user/installations", (&self).into()).await
}
}
#[derive(serde::Serialize)]
pub struct ListUserInstallationRepositoriesBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip)]
installation_id: InstallationId,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo> ListUserInstallationRepositoriesBuilder<'octo> {
fn new(crab: &'octo Octocrab, installation_id: InstallationId) -> Self {
Self {
crab,
installation_id,
per_page: None,
page: None,
}
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u32>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> crate::Result<InstallationRepositories> {
let route = format!("/user/installations/{}/repositories", self.installation_id);
self.crab.get(route, Some(&self)).await
}
}
#[derive(serde::Serialize)]
pub struct ListAllTeamsForAuthUserBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u8>,
}
impl<'octo> ListAllTeamsForAuthUserBuilder<'octo> {
fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
per_page: None,
page: None,
}
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u8>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> crate::Result<Page<FullTeam>> {
self.crab.get("/user/teams", (&self).into()).await
}
}
#[derive(serde::Serialize)]
pub struct ListCurrentUserFollowingBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo> ListCurrentUserFollowingBuilder<'octo> {
fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
per_page: None,
page: None,
}
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u32>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> crate::Result<Page<Followee>> {
self.crab.get("/user/following", Some(&self)).await
}
}
#[derive(serde::Serialize)]
pub struct ListCurrentUserFollowersBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo> ListCurrentUserFollowersBuilder<'octo> {
fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
per_page: None,
page: None,
}
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u32>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> crate::Result<Page<Follower>> {
self.crab.get("/user/followers", Some(&self)).await
}
}
pub struct UserRepoInvitationsHandler<'octo> {
crab: &'octo Octocrab,
}
impl<'octo> UserRepoInvitationsHandler<'octo> {
pub(crate) fn new(crab: &'octo Octocrab) -> Self {
Self { crab }
}
pub fn list(&self) -> ListUserRepoInvitationsBuilder<'octo> {
ListUserRepoInvitationsBuilder::new(self.crab)
}
pub async fn accept(
&self,
invitation_id: impl Into<crate::models::InvitationId>,
) -> Result<()> {
let route = format!("/user/repository_invitations/{}", invitation_id.into());
let response = self.crab._patch(route, None::<&()>).await?;
if response.status() != http::StatusCode::NO_CONTENT {
return Err(crate::map_github_error(response).await.unwrap_err());
}
Ok(())
}
pub async fn decline(
&self,
invitation_id: impl Into<crate::models::InvitationId>,
) -> Result<()> {
let route = format!("/user/repository_invitations/{}", invitation_id.into());
let response = self.crab._delete(route, None::<&()>).await?;
if response.status() != http::StatusCode::NO_CONTENT {
return Err(crate::map_github_error(response).await.unwrap_err());
}
Ok(())
}
}
#[derive(serde::Serialize)]
pub struct ListUserRepoInvitationsBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo> ListUserRepoInvitationsBuilder<'octo> {
pub(crate) fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
per_page: None,
page: None,
}
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u32>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> Result<Page<crate::models::repos::RepositoryInvitation>> {
self.crab
.get("/user/repository_invitations", Some(&self))
.await
}
}
#[derive(serde::Serialize)]
pub struct ListUserOrgsBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip)]
route: String,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo> ListUserOrgsBuilder<'octo> {
pub(crate) fn new(crab: &'octo Octocrab, route: impl Into<String>) -> Self {
Self {
crab,
route: route.into(),
per_page: None,
page: None,
}
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u32>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> Result<Page<crate::models::orgs::Organization>> {
self.crab.get(&self.route, Some(&self)).await
}
}
#[derive(serde::Serialize)]
pub struct ListUserIssuesBuilder<'octo, 'd> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
filter: Option<params::issues::IssueFilter>,
#[serde(skip_serializing_if = "Option::is_none")]
state: Option<params::State>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(serialize_with = "comma_separated")]
labels: Option<&'d [String]>,
#[serde(skip_serializing_if = "Option::is_none")]
sort: Option<params::issues::Sort>,
#[serde(skip_serializing_if = "Option::is_none")]
direction: Option<params::Direction>,
#[serde(skip_serializing_if = "Option::is_none")]
since: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo, 'd> ListUserIssuesBuilder<'octo, 'd> {
pub(crate) fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
filter: None,
state: None,
labels: None,
sort: None,
direction: None,
since: None,
per_page: None,
page: None,
}
}
pub fn filter(mut self, filter: params::issues::IssueFilter) -> Self {
self.filter = Some(filter);
self
}
pub fn state(mut self, state: params::State) -> Self {
self.state = Some(state);
self
}
pub fn labels(mut self, labels: &'d (impl AsRef<[String]> + ?Sized)) -> Self {
self.labels = Some(labels.as_ref());
self
}
pub fn sort(mut self, sort: impl Into<params::issues::Sort>) -> Self {
self.sort = Some(sort.into());
self
}
pub fn direction(mut self, direction: impl Into<params::Direction>) -> Self {
self.direction = Some(direction.into());
self
}
pub fn since(mut self, since: impl Into<DateTime<Utc>>) -> Self {
self.since = Some(since.into());
self
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u32>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> Result<Page<models::issues::Issue>> {
self.crab.get("/user/issues", Some(&self)).await
}
}
#[derive(serde::Serialize)]
pub struct ListAllIssuesBuilder<'octo, 'd> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
filter: Option<params::issues::IssueFilter>,
#[serde(skip_serializing_if = "Option::is_none")]
state: Option<params::State>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(serialize_with = "comma_separated")]
labels: Option<&'d [String]>,
#[serde(skip_serializing_if = "Option::is_none")]
sort: Option<params::issues::Sort>,
#[serde(skip_serializing_if = "Option::is_none")]
direction: Option<params::Direction>,
#[serde(skip_serializing_if = "Option::is_none")]
since: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
impl<'octo, 'd> ListAllIssuesBuilder<'octo, 'd> {
pub(crate) fn new(crab: &'octo Octocrab) -> Self {
Self {
crab,
filter: None,
state: None,
labels: None,
sort: None,
direction: None,
since: None,
per_page: None,
page: None,
}
}
pub fn filter(mut self, filter: params::issues::IssueFilter) -> Self {
self.filter = Some(filter);
self
}
pub fn state(mut self, state: params::State) -> Self {
self.state = Some(state);
self
}
pub fn labels(mut self, labels: &'d (impl AsRef<[String]> + ?Sized)) -> Self {
self.labels = Some(labels.as_ref());
self
}
pub fn sort(mut self, sort: impl Into<params::issues::Sort>) -> Self {
self.sort = Some(sort.into());
self
}
pub fn direction(mut self, direction: impl Into<params::Direction>) -> Self {
self.direction = Some(direction.into());
self
}
pub fn since(mut self, since: impl Into<DateTime<Utc>>) -> Self {
self.since = Some(since.into());
self
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u32>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> Result<Page<models::issues::Issue>> {
self.crab.get("/issues", Some(&self)).await
}
}
fn comma_separated<S: serde::Serializer>(
labels: &Option<&[String]>,
serializer: S,
) -> std::result::Result<S::Ok, S::Error> {
serializer.serialize_str(&labels.unwrap().join(","))
}