1#![allow(unused)]
2
3use crate::prelude::*;
4
5pub struct FleetsGroup<'a> {
7 pub(crate) esi: &'a Esi,
8}
9
10#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
11pub enum FleetRole {
13 #[serde(rename = "fleet_commander")]
15 FleetCommander,
16 #[serde(rename = "wing_commander")]
18 WingCommander,
19 #[serde(rename = "squad_commander")]
21 SquadCommander,
22 #[serde(rename = "squad_member")]
24 SquadMember,
25 #[serde(other)]
27 Unrecognized,
28}
29
30#[derive(Debug, Deserialize, Serialize, Clone)]
31pub struct CharacterFleet {
33 pub fleet_boss_id: i64,
35 pub fleet_id: i64,
37 pub role: FleetRole,
39 pub squad_id: i64,
41 pub wing_id: i64,
43}
44
45#[derive(Debug, Deserialize, Serialize, Clone)]
46pub struct FleetInfo {
48 pub is_free_move: bool,
50 pub is_registered: bool,
52 pub is_voice_enabled: bool,
54 pub motd: String,
56}
57
58#[derive(Debug, Serialize, Clone, Default)]
59pub struct FleetUpdate {
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub is_free_move: Option<bool>,
64 #[serde(skip_serializing_if = "Option::is_none")]
66 pub motd: Option<String>,
67}
68
69#[derive(Debug, Deserialize, Serialize, Clone)]
70pub struct FleetMember {
72 pub character_id: i64,
74 pub join_time: String,
76 pub role: FleetRole,
78 pub role_name: String,
80 pub ship_type_id: i64,
82 pub solar_system_id: i64,
84 pub squad_id: i64,
86 #[serde(default)]
88 pub station_id: Option<i64>,
89 pub takes_fleet_warp: bool,
91 pub wing_id: i64,
93}
94
95#[derive(Debug, Serialize, Clone)]
96pub struct FleetInvitation {
98 pub character_id: i64,
100 pub role: FleetRole,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub squad_id: Option<i64>,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub wing_id: Option<i64>,
108}
109
110#[derive(Debug, Serialize, Clone)]
111pub struct FleetMovement {
113 pub role: FleetRole,
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub squad_id: Option<i64>,
118 #[serde(skip_serializing_if = "Option::is_none")]
120 pub wing_id: Option<i64>,
121}
122
123#[derive(Debug, Serialize, Clone)]
124pub struct FleetNaming {
126 pub name: String,
128}
129
130#[derive(Debug, Deserialize, Serialize, Clone)]
131pub struct FleetSquad {
133 pub id: i64,
135 pub name: String,
137}
138
139#[derive(Debug, Deserialize, Serialize, Clone)]
140pub struct FleetWing {
142 pub id: i64,
144 pub name: String,
146 pub squads: Vec<FleetSquad>,
148}
149
150#[derive(Debug, Deserialize, Serialize, Clone, Copy)]
151pub struct CreatedWing {
153 pub wing_id: i64,
155}
156
157#[derive(Debug, Deserialize, Serialize, Clone, Copy)]
158pub struct CreatedSquad {
160 pub squad_id: i64,
162}
163
164impl FleetsGroup<'_> {
165 api_get!(
166 get_character_fleet,
168 "GetCharactersCharacterIdFleet",
169 RequestType::Authenticated,
170 CharacterFleet,
171 (character_id: i64) => "{character_id}"
172 );
173
174 api_get!(
175 get_fleet,
177 "GetFleetsFleetId",
178 RequestType::Authenticated,
179 FleetInfo,
180 (fleet_id: i64) => "{fleet_id}"
181 );
182
183 api_put!(
184 update_fleet,
186 "PutFleetsFleetId",
187 RequestType::Authenticated,
188 (),
189 (fleet_id: i64) => "{fleet_id}",
190 settings: &FleetUpdate,
191 );
192
193 api_get!(
194 get_members,
196 "GetFleetsFleetIdMembers",
197 RequestType::Authenticated,
198 Vec<FleetMember>,
199 (fleet_id: i64) => "{fleet_id}"
200 );
201
202 api_post!(
203 invite_member,
205 "PostFleetsFleetIdMembers",
206 RequestType::Authenticated,
207 (),
208 (fleet_id: i64) => "{fleet_id}",
209 invitation: &FleetInvitation,
210 );
211
212 api_delete!(
213 kick_member,
215 "DeleteFleetsFleetIdMembersMemberId",
216 RequestType::Authenticated,
217 (),
218 (fleet_id: i64) => "{fleet_id}",
219 (member_id: i64) => "{member_id}"
220 );
221
222 api_put!(
223 move_member,
225 "PutFleetsFleetIdMembersMemberId",
226 RequestType::Authenticated,
227 (),
228 (fleet_id: i64) => "{fleet_id}",
229 (member_id: i64) => "{member_id}",
230 movement: &FleetMovement,
231 );
232
233 api_delete!(
234 delete_squad,
236 "DeleteFleetsFleetIdSquadsSquadId",
237 RequestType::Authenticated,
238 (),
239 (fleet_id: i64) => "{fleet_id}",
240 (squad_id: i64) => "{squad_id}"
241 );
242
243 api_put!(
244 rename_squad,
246 "PutFleetsFleetIdSquadsSquadId",
247 RequestType::Authenticated,
248 (),
249 (fleet_id: i64) => "{fleet_id}",
250 (squad_id: i64) => "{squad_id}",
251 naming: &FleetNaming,
252 );
253
254 api_get!(
255 get_wings,
257 "GetFleetsFleetIdWings",
258 RequestType::Authenticated,
259 Vec<FleetWing>,
260 (fleet_id: i64) => "{fleet_id}"
261 );
262
263 api_post!(
264 create_wing,
266 "PostFleetsFleetIdWings",
267 RequestType::Authenticated,
268 CreatedWing,
269 (fleet_id: i64) => "{fleet_id}";
270 NoBody
271 );
272
273 api_delete!(
274 delete_wing,
276 "DeleteFleetsFleetIdWingsWingId",
277 RequestType::Authenticated,
278 (),
279 (fleet_id: i64) => "{fleet_id}",
280 (wing_id: i64) => "{wing_id}"
281 );
282
283 api_put!(
284 rename_wing,
286 "PutFleetsFleetIdWingsWingId",
287 RequestType::Authenticated,
288 (),
289 (fleet_id: i64) => "{fleet_id}",
290 (wing_id: i64) => "{wing_id}",
291 naming: &FleetNaming,
292 );
293
294 api_post!(
295 create_squad,
297 "PostFleetsFleetIdWingsWingIdSquads",
298 RequestType::Authenticated,
299 CreatedSquad,
300 (fleet_id: i64) => "{fleet_id}",
301 (wing_id: i64) => "{wing_id}";
302 NoBody
303 );
304}
305
306#[cfg(test)]
307mod fleets_tests {
308 use super::*;
309
310 #[test]
311 fn test_parse_fleet_and_members() {
312 let f: CharacterFleet = serde_json::from_str(
313 r#"{"fleet_boss_id": 1, "fleet_id": 1234567890123, "role": "squad_member",
314 "squad_id": -1, "wing_id": 2000000000000}"#,
315 )
316 .unwrap();
317 assert_eq!(f.fleet_id, 1_234_567_890_123);
318 assert_eq!(f.role, FleetRole::SquadMember);
319 let m: Vec<FleetMember> = serde_json::from_str(
320 r#"[{"character_id": 1, "join_time": "t", "role": "new_role", "role_name": "r",
321 "ship_type_id": 587, "solar_system_id": 30000142, "squad_id": 1, "wing_id": 2,
322 "takes_fleet_warp": true}]"#,
323 )
324 .unwrap();
325 assert_eq!(m[0].role, FleetRole::Unrecognized);
326 assert_eq!(m[0].station_id, None);
327 }
328
329 #[test]
330 fn test_serialize_bodies() {
331 let inv = FleetInvitation {
332 character_id: 1,
333 role: FleetRole::SquadMember,
334 squad_id: Some(5),
335 wing_id: None,
336 };
337 assert_eq!(
338 serde_json::to_string(&inv).unwrap(),
339 r#"{"character_id":1,"role":"squad_member","squad_id":5}"#
340 );
341 let u = FleetUpdate {
342 is_free_move: Some(true),
343 motd: None,
344 };
345 assert_eq!(
346 serde_json::to_string(&u).unwrap(),
347 r#"{"is_free_move":true}"#
348 );
349 }
350
351 #[test]
352 fn test_parse_wings_and_created() {
353 let w: Vec<FleetWing> =
354 serde_json::from_str(r#"[{"id": 1, "name": "w", "squads": [{"id": 2, "name": "s"}]}]"#)
355 .unwrap();
356 assert_eq!(w[0].squads[0].id, 2);
357 let c: CreatedWing = serde_json::from_str(r#"{"wing_id": 2000000000000}"#).unwrap();
358 assert_eq!(c.wing_id, 2_000_000_000_000);
359 }
360}