team04_server/messages/
lobby_info.rs

1use client_role::PlayerRole;
2use player_character::{PlayerCharacter, PlayerCharacterOrNone};
3
4use crate::lobby::state::LobbyState;
5
6use super::*;
7
8pub struct LobbyInfo<'a> {
9    spectators: Vec<&'a str>,
10    players: Vec<Player<'a>>,
11    available_characters: Vec<PlayerCharacter>,
12}
13#[derive(Serialize)]
14pub struct Player<'a> {
15    #[serde(rename = "type")]
16    role: PlayerRole,
17    name: &'a str,
18    character: PlayerCharacterOrNone,
19    ready: bool,
20}
21
22impl<'a> LobbyInfo<'a> {
23    pub fn new_from_lobby_state(lobby_state: &'a LobbyState) -> Self {
24        Self {
25            spectators: lobby_state
26                .clients
27                .spectators
28                .iter()
29                .map(|spectator| spectator.name())
30                .collect(),
31            players: lobby_state
32                .clients
33                .players
34                .players_all()
35                .map(|player| Player {
36                    role: player.role,
37                    name: player.name(),
38                    character: PlayerCharacterOrNone(player.character),
39                    ready: player.ready,
40                })
41                .collect(),
42            available_characters: lobby_state.available_characters(),
43        }
44    }
45}
46
47impl MessageTx for LobbyInfo<'_> {
48    fn serialize(&self) -> String {
49        #[derive(Serialize)]
50        struct LobbyInfo<'a, 'b> {
51            #[serde(rename = "messageType")]
52            message_type: &'static str,
53            spectators: &'b Vec<&'a str>,
54            players: &'b Vec<Player<'a>>,
55            #[serde(rename = "availableCharacters")]
56            available_characters: &'b Vec<PlayerCharacter>,
57        }
58
59        let message = LobbyInfo {
60            message_type: "LOBBY_INFO",
61            spectators: &self.spectators,
62            players: &self.players,
63            available_characters: &self.available_characters,
64        };
65
66        serialize(&message)
67    }
68}