1use constcat::concat;
2use serde::{Deserialize, Serialize};
3use typed_builder::TypedBuilder;
4
5use crate::object::*;
6
7const BASE_API_URL: &str = "https://hangar.papermc.io/api/v1";
9
10pub trait HangarRequest {
12 fn url(&self) -> String;
14}
15
16#[derive(Debug, Default, Serialize, TypedBuilder)]
18#[serde(rename_all = "camelCase")]
19#[builder(field_defaults(default, setter(into)))]
20pub struct ProjectsRequest {
21 prioritize_exact_match: Option<bool>,
23 #[builder(!default)]
25 #[serde(flatten)]
26 pagination: Pagination,
27 sort: Option<ProjectsSort>,
29 category: Option<Category>,
31 platform: Option<Platform>,
33 owner: Option<String>,
35 query: Option<String>,
37 license: Option<String>,
39 version: Option<String>,
41 tag: Option<String>,
43 member: Option<String>,
45}
46
47impl HangarRequest for ProjectsRequest {
48 fn url(&self) -> String {
49 concat!(BASE_API_URL, "/projects").to_string()
50 }
51}
52
53#[derive(Debug, Deserialize)]
54pub struct ProjectsResponse {
55 pub pagination: PaginationResponse,
56 pub result: Vec<Project>,
57}
58
59#[derive(Debug, Deserialize)]
60pub struct PaginationResponse {
61 pub limit: i64,
63 pub offset: i64,
65 pub count: i64,
67}
68
69#[derive(Debug, Serialize, TypedBuilder)]
71#[builder(field_defaults(setter(into)))]
72pub struct ProjectRequest {
73 #[serde(skip)]
75 pub slug: String,
76}
77
78impl HangarRequest for ProjectRequest {
79 fn url(&self) -> String {
80 format!("{}/projects/{}", BASE_API_URL, self.slug)
81 }
82}
83
84#[derive(Debug, Serialize, TypedBuilder)]
86#[builder(field_defaults(setter(into)))]
87pub struct PageRequest {
88 #[serde(skip)]
90 pub slug: String,
91 pub path: String,
93}
94
95impl HangarRequest for PageRequest {
96 fn url(&self) -> String {
97 format!("{}/pages/page/{}", BASE_API_URL, self.slug)
98 }
99}
100
101#[derive(Debug, Serialize, TypedBuilder)]
103#[builder(field_defaults(default, setter(into)))]
104#[serde(rename_all = "camelCase")]
105pub struct VersionsRequest {
106 #[builder(!default)]
108 #[serde(skip)]
109 pub slug: String,
110 #[builder(!default)]
111 #[serde(flatten)]
112 pub pagination: Pagination,
113 pub include_hidden_channels: Option<bool>,
115 pub channel: Option<String>,
117 pub platform: Option<Platform>,
119 pub platform_version: Option<String>,
121}
122
123impl HangarRequest for VersionsRequest {
124 fn url(&self) -> String {
125 format!("{}/projects/{}/versions", BASE_API_URL, self.slug)
126 }
127}
128
129#[derive(Debug, Deserialize)]
130pub struct VersionsResponse {
131 pub pagination: PaginationResponse,
132 pub result: Vec<Version>,
133}
134
135#[derive(Debug, Serialize, TypedBuilder)]
137pub struct VersionRequest {
138 #[serde(skip)]
140 pub slug: String,
141 #[serde(skip)]
143 pub name: String,
144}
145
146impl HangarRequest for VersionRequest {
147 fn url(&self) -> String {
148 format!(
149 "{}/projects/{}/versions/{}",
150 BASE_API_URL, self.slug, self.name
151 )
152 }
153}