ddapi_rs/api/ddnet.rs
1use crate::api::DDApi;
2use crate::scheme::ddnet::*;
3use anyhow::Result;
4use std::future::Future;
5
6#[allow(dead_code)]
7pub trait DDnetApi {
8 fn master(&self) -> impl Future<Output = Result<Master>> + Send;
9 fn skins(&self) -> impl Future<Output = Result<DDSkins>> + Send;
10 fn custom_master(&self, master: MasterServer) -> impl Future<Output = Result<Master>> + Send;
11 fn player(&self, player: &str) -> impl Future<Output = Result<Player>> + Send;
12 fn query(&self, player: &str) -> impl Future<Output = Result<Vec<Query>>> + Send;
13 fn query_map(&self, player: &str) -> impl Future<Output = Result<Vec<QueryMap>>> + Send;
14 fn query_mapper(&self, player: &str) -> impl Future<Output = Result<Vec<QueryMapper>>> + Send;
15 fn map(&self, map: &str) -> impl Future<Output = Result<Map>> + Send;
16 fn releases_map(&self) -> impl Future<Output = Result<Vec<ReleasesMaps>>> + Send;
17 fn status(&self) -> impl Future<Output = Result<Status>> + Send;
18}
19
20impl DDnetApi for DDApi {
21 /// Fetches server list from the default master server
22 ///
23 /// Returns a list of game servers from the primary master server (master1.ddnet.org).
24 ///
25 /// # Examples
26 ///
27 /// ```rust,ignore
28 /// use ddapi_rs::prelude::*;
29 ///
30 /// let api = DDApi::new();
31 /// let master = api.master().await?;
32 /// println!("Found {} servers", master.servers.len());
33 /// ```
34 async fn master(&self) -> Result<Master> {
35 self.custom_master(MasterServer::One).await
36 }
37
38 /// Fetches server list from a specific master server
39 ///
40 /// Allows selecting which master server to query. DDNet has multiple
41 /// master servers for redundancy and load distribution.
42 ///
43 /// # Arguments
44 ///
45 /// * `master` - The master server to query (`MasterServer::One`, `MasterServer::Two`, etc.)
46 ///
47 /// # Examples
48 ///
49 /// ```rust,ignore
50 /// use ddapi_rs::prelude::*;
51 /// use ddapi_rs::prelude::ddnet::*;
52 ///
53 /// let api = DDApi::new();
54 /// // Use secondary master server as fallback
55 /// let master = api.custom_master(MasterServer::Two).await?;
56 /// ```
57 async fn custom_master(&self, master: MasterServer) -> Result<Master> {
58 self._generator_no_cache(&Master::api(master)).await
59 }
60
61 /// # Examples
62 ///
63 /// ```rust,ignore
64 /// use ddapi_rs::prelude::*;
65 /// use ddapi_rs::prelude::ddnet::*;
66 ///
67 /// let api = DDApi::new();
68 /// let skins: DDSkins = api.skins().await?;
69 /// println!("Found {} available skins", skins.skins.len());
70 /// for skin in skins.skins {
71 /// println!("Skin: {} by {}", skin.name, skin.creator);
72 /// }
73 /// ```
74 async fn skins(&self) -> Result<DDSkins> {
75 self._generator(&DDSkins::api()).await
76 }
77
78 /// # Examples
79 ///
80 /// ```rust,ignore
81 /// use ddapi_rs::prelude::*;
82 /// use ddapi_rs::prelude::ddnet::*;
83 ///
84 /// let api = DDApi::new();
85 /// let player: Player = api.player("nameless tee").await?;
86 /// println!("{}: {}", player.player, player.points.points.unwrap_or(0));
87 /// ```
88 async fn player(&self, player: &str) -> Result<Player> {
89 self._generator(&Player::api(player)).await
90 }
91
92 /// # Examples
93 ///
94 /// ```rust,ignore
95 /// use ddapi_rs::prelude::*;
96 /// use ddapi_rs::prelude::ddnet::*;
97 ///
98 /// let api = DDApi::new();
99 /// let query: Vec<Query> = api.query("nameless tee").await?;
100 /// for player in &query {
101 /// println!("{}: {}", player.name, player.points);
102 /// }
103 /// ```
104 async fn query(&self, player: &str) -> Result<Vec<Query>> {
105 self._generator(&Query::api(player)).await
106 }
107
108 /// # Examples
109 ///
110 /// ```rust,ignore
111 /// use ddapi_rs::prelude::*;
112 /// use ddapi_rs::prelude::ddnet::*;
113 ///
114 /// let api = DDApi::new();
115 /// let query: Vec<QueryMap> = api.query_map("multi").await?;
116 /// for map in &query {
117 /// println!("{}: {} | {}", map.name, map.mapper, map.r#type);
118 /// }
119 /// ```
120 async fn query_map(&self, map: &str) -> Result<Vec<QueryMap>> {
121 self._generator(&QueryMap::api(map)).await
122 }
123
124 /// # Examples
125 ///
126 /// ```rust,ignore
127 /// use ddapi_rs::prelude::*;
128 /// use ddapi_rs::prelude::ddnet::*;
129 ///
130 /// let api = DDApi::new();
131 /// let query: Vec<QueryMapper> = api.query_mapper("Ao").await?;
132 /// for player in &query {
133 /// println!("{}: {}", player.mapper, player.num_maps);
134 /// }
135 /// ```
136 async fn query_mapper(&self, player: &str) -> Result<Vec<QueryMapper>> {
137 self._generator(&QueryMapper::api(player)).await
138 }
139
140 /// # Examples
141 ///
142 /// ```rust,ignore
143 /// use ddapi_rs::prelude::*;
144 /// use ddapi_rs::prelude::ddnet::*;
145 ///
146 /// let api = DDApi::new();
147 /// let map: Map = api.map("Fox").await?;
148 /// println!("{}: {}", map.mapper, map.web_preview);
149 /// ```
150 async fn map(&self, map: &str) -> Result<Map> {
151 self._generator(&Map::api(map)).await
152 }
153
154 /// # Examples
155 ///
156 /// ```rust,ignore
157 /// use ddapi_rs::prelude::*;
158 /// use ddapi_rs::prelude::ddnet::*;
159 ///
160 /// let api = DDApi::new();
161 /// let maps: Vec<ReleasesMaps> = api.releases_map().await?;
162 /// for map in &maps {
163 /// println!("{}: {} | {}", map.name, map.mapper, map.r#type);
164 /// }
165 /// ```
166 async fn releases_map(&self) -> Result<Vec<ReleasesMaps>> {
167 self._generator_no_cache(&ReleasesMaps::api()).await
168 }
169
170 /// # Examples
171 ///
172 /// ```rust,ignore
173 /// use ddapi_rs::prelude::*;
174 /// use ddapi_rs::prelude::ddnet::*;
175 ///
176 /// let api = DDApi::new();
177 /// let status: Status = api.status().await?;
178 /// for data in &status.servers {
179 /// println!("{}: {} | {}", data.name, data.location, data.host);
180 /// }
181 /// ```
182 async fn status(&self) -> Result<Status> {
183 self._generator_no_cache(&Status::api()).await
184 }
185}