rs_pixel/types/
server_type.rs1use 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}