rs_pixel/types/
server_type.rs

1use super::{game_type::GameType, lobby_type::LobbyType};
2use serde::{
3    de::{self, Visitor},
4    Deserialize, Deserializer, Serialize,
5};
6use std::fmt;
7
8#[derive(Serialize, Debug)]
9pub enum ServerType {
10    GameType(GameType),
11    LobbyType(LobbyType),
12    Unknown,
13}
14
15impl ServerType {
16    pub fn get_game_type(&self) -> Option<&GameType> {
17        if let ServerType::GameType(v) = self {
18            Some(v)
19        } else {
20            None
21        }
22    }
23
24    pub fn get_lobby_type(&self) -> Option<&LobbyType> {
25        if let ServerType::LobbyType(v) = self {
26            Some(v)
27        } else {
28            None
29        }
30    }
31}
32
33impl<'de> Deserialize<'de> for ServerType {
34    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
35    where
36        D: Deserializer<'de>,
37    {
38        struct ServerTypeVisitor;
39
40        impl<'de> Visitor<'de> for ServerTypeVisitor {
41            type Value = ServerType;
42
43            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
44                formatter.write_str("a String")
45            }
46
47            fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
48            where
49                E: de::Error,
50            {
51                if let Ok(game_type) = GameType::try_from(value.clone()) {
52                    return Ok(ServerType::GameType(game_type));
53                }
54
55                if let Ok(lobby_type) = LobbyType::try_from(value) {
56                    return Ok(ServerType::LobbyType(lobby_type));
57                }
58
59                Ok(ServerType::Unknown)
60            }
61
62            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
63            where
64                E: de::Error,
65            {
66                if let Ok(game_type) = GameType::try_from(value.to_string()) {
67                    return Ok(ServerType::GameType(game_type));
68                }
69
70                if let Ok(lobby_type) = LobbyType::try_from(value.to_string()) {
71                    return Ok(ServerType::LobbyType(lobby_type));
72                }
73
74                Ok(ServerType::Unknown)
75            }
76        }
77
78        deserializer.deserialize_any(ServerTypeVisitor)
79    }
80}