use serde::Serialize;
pub use crate::api::repos::{
ListWatchersBuilder, RepoSubscriptionHandler, SetRepoSubscriptionBuilder,
};
use crate::models::{activity::RepositorySubscription, Repository};
use crate::{Octocrab, Page, Result};
pub type SetRepositorySubscriptionBuilder<'octo> = SetRepoSubscriptionBuilder<'octo>;
pub struct WatchingHandler<'octo> {
crab: &'octo Octocrab,
}
impl<'octo> WatchingHandler<'octo> {
pub(crate) fn new(crab: &'octo Octocrab) -> Self {
Self { crab }
}
pub fn list_watchers(
&self,
owner: impl Into<String>,
repo: impl Into<String>,
) -> ListWatchersBuilder<'octo> {
ListWatchersBuilder::new(
self.crab,
format!("/repos/{}/{}/subscribers", owner.into(), repo.into()),
)
}
pub async fn get_repository_subscription(
&self,
owner: impl AsRef<str>,
repo: impl AsRef<str>,
) -> Result<RepositorySubscription> {
let route = format!(
"/repos/{owner}/{repo}/subscription",
owner = owner.as_ref(),
repo = repo.as_ref()
);
RepoSubscriptionHandler::new(self.crab, route).get().await
}
pub fn set_repository_subscription(
&self,
owner: impl Into<String>,
repo: impl Into<String>,
) -> SetRepoSubscriptionBuilder<'octo> {
let route = format!("/repos/{}/{}/subscription", owner.into(), repo.into());
SetRepoSubscriptionBuilder::new(self.crab, route)
}
pub async fn delete_repository_subscription(
&self,
owner: impl AsRef<str>,
repo: impl AsRef<str>,
) -> Result<()> {
let route = format!(
"/repos/{owner}/{repo}/subscription",
owner = owner.as_ref(),
repo = repo.as_ref()
);
RepoSubscriptionHandler::new(self.crab, route)
.delete()
.await
}
pub fn list_watched_repos_for_authenticated_user(&self) -> ListUserSubscriptionsBuilder<'octo> {
ListUserSubscriptionsBuilder::new(self.crab, "/user/subscriptions")
}
pub fn list_watched_repos_for_user(
&self,
username: impl Into<String>,
) -> ListUserSubscriptionsBuilder<'octo> {
ListUserSubscriptionsBuilder::new(
self.crab,
format!(
"/users/{username}/subscriptions",
username = username.into()
),
)
}
}
#[derive(Serialize)]
pub struct ListUserSubscriptionsBuilder<'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> ListUserSubscriptionsBuilder<'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<Repository>> {
self.crab.get(&self.route, Some(&self)).await
}
}