use std::sync::Arc;
use reqwest::Method;
use serde::Deserialize;
use crate::config::Config;
#[derive(Clone, Debug)]
pub struct ProjectsSvc(pub(crate) Arc<Config>);
impl ProjectsSvc {
#[maybe_async::maybe_async]
pub async fn list(&self, options: ListProjectsOptions) -> crate::Result<ListProjectsResponse> {
let mut request = self.0.build(Method::GET, "/projects");
if let Some(per_page) = options.per_page {
request = request.query(&[("per_page", per_page.to_string())]);
}
if let Some(page) = options.page {
request = request.query(&[("page", page.to_string())]);
}
let response = self.0.send(request).await?;
let wrapper = response.json::<ListProjectsResponseWrapper>().await?;
Ok(wrapper.data)
}
}
#[must_use]
#[derive(Debug, Default, Clone)]
pub struct ListProjectsOptions {
per_page: Option<u32>,
page: Option<u32>,
}
impl ListProjectsOptions {
pub fn new() -> Self {
Self::default()
}
#[inline]
pub fn per_page(mut self, per_page: u32) -> Self {
self.per_page = Some(per_page);
self
}
#[inline]
pub fn page(mut self, page: u32) -> Self {
self.page = Some(page);
self
}
}
#[derive(Debug, Deserialize)]
struct ListProjectsResponseWrapper {
#[allow(dead_code)]
message: String,
data: ListProjectsResponse,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListProjectsResponse {
pub projects: Vec<Project>,
pub pagination: ProjectsPagination,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Project {
pub id: u64,
pub name: String,
pub emoji: Option<String>,
pub team_id: u64,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ProjectsPagination {
pub total: u64,
pub per_page: u32,
pub current_page: u32,
pub last_page: u32,
}