use constcat::concat;
use serde::{Deserialize, Serialize};
use typed_builder::TypedBuilder;
use crate::object::*;
const BASE_API_URL: &str = "https://hangar.papermc.io/api/v1";
pub trait HangarRequest {
fn url(&self) -> String;
}
#[derive(Debug, Default, Serialize, TypedBuilder)]
#[serde(rename_all = "camelCase")]
#[builder(field_defaults(default, setter(into)))]
pub struct ProjectsRequest {
prioritize_exact_match: Option<bool>,
#[builder(!default)]
#[serde(flatten)]
pagination: Pagination,
sort: Option<ProjectsSort>,
category: Option<Category>,
platform: Option<Platform>,
owner: Option<String>,
query: Option<String>,
license: Option<String>,
version: Option<String>,
tag: Option<String>,
member: Option<String>,
}
impl HangarRequest for ProjectsRequest {
fn url(&self) -> String {
concat!(BASE_API_URL, "/projects").to_string()
}
}
#[derive(Debug, Deserialize)]
pub struct ProjectsResponse {
pub pagination: PaginationResponse,
pub result: Vec<Project>,
}
#[derive(Debug, Deserialize)]
pub struct PaginationResponse {
pub limit: i64,
pub offset: i64,
pub count: i64,
}
#[derive(Debug, Serialize, TypedBuilder)]
#[builder(field_defaults(setter(into)))]
pub struct ProjectRequest {
#[serde(skip)]
pub slug: String,
}
impl HangarRequest for ProjectRequest {
fn url(&self) -> String {
format!("{}/projects/{}", BASE_API_URL, self.slug)
}
}
#[derive(Debug, Serialize, TypedBuilder)]
#[builder(field_defaults(setter(into)))]
pub struct PageRequest {
#[serde(skip)]
pub slug: String,
pub path: String,
}
impl HangarRequest for PageRequest {
fn url(&self) -> String {
format!("{}/pages/page/{}", BASE_API_URL, self.slug)
}
}
#[derive(Debug, Serialize, TypedBuilder)]
#[builder(field_defaults(default, setter(into)))]
#[serde(rename_all = "camelCase")]
pub struct VersionsRequest {
#[builder(!default)]
#[serde(skip)]
pub slug: String,
#[builder(!default)]
#[serde(flatten)]
pub pagination: Pagination,
pub include_hidden_channels: Option<bool>,
pub channel: Option<String>,
pub platform: Option<Platform>,
pub platform_version: Option<String>,
}
impl HangarRequest for VersionsRequest {
fn url(&self) -> String {
format!("{}/projects/{}/versions", BASE_API_URL, self.slug)
}
}
#[derive(Debug, Deserialize)]
pub struct VersionsResponse {
pub pagination: PaginationResponse,
pub result: Vec<Version>,
}
#[derive(Debug, Serialize, TypedBuilder)]
pub struct VersionRequest {
#[serde(skip)]
pub slug: String,
#[serde(skip)]
pub name: String,
}
impl HangarRequest for VersionRequest {
fn url(&self) -> String {
format!(
"{}/projects/{}/versions/{}",
BASE_API_URL, self.slug, self.name
)
}
}