use http::header::HeaderMap;
use http::header::ACCEPT;
use serde::Serialize;
use crate::models::activity::StarredRepository;
use crate::Octocrab;
use crate::Page;
use crate::Result;
pub struct StarringHandler<'octo> {
crab: &'octo Octocrab,
}
impl<'octo> StarringHandler<'octo> {
pub(crate) fn new(crab: &'octo Octocrab) -> Self {
Self { crab }
}
pub fn list_repos_starred_by_user(
&self,
username: impl Into<String>,
) -> ListReposStarredByUserBuilder<'_> {
ListReposStarredByUserBuilder::new(self.crab, username)
}
}
#[derive(Serialize)]
pub struct ListReposStarredByUserBuilder<'octo> {
#[serde(skip)]
crab: &'octo Octocrab,
#[serde(skip_serializing_if = "Option::is_none")]
direction: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
sort: Option<String>,
#[serde(skip)]
username: String,
}
impl<'octo> ListReposStarredByUserBuilder<'octo> {
pub fn new(crab: &'octo Octocrab, username: impl Into<String>) -> Self {
Self {
crab,
direction: None,
page: None,
per_page: None,
sort: None,
username: username.into(),
}
}
pub fn direction(mut self, direction: impl Into<String>) -> Self {
self.direction = Some(direction.into());
self
}
pub fn page(mut self, page: impl Into<u8>) -> Self {
self.page = Some(page.into());
self
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub async fn send(self) -> Result<Page<StarredRepository>> {
let mut headers = HeaderMap::new();
headers.insert(
ACCEPT,
"application/vnd.github.star+json"
.parse()
.expect("valid header value"),
);
self.crab
.get_with_headers(
format!("/users/{username}/starred", username = self.username),
None::<&()>,
Some(headers),
)
.await
}
pub fn sort(mut self, sort: impl Into<String>) -> Self {
self.sort = Some(sort.into());
self
}
}