team04_server/messages/
mod.rs1pub mod attack;
6pub mod character_chosen;
8pub mod client_role;
10pub mod connect_game;
12pub mod connected;
14pub mod end_fight;
16pub mod error;
18pub mod game_end;
20pub mod game_start;
22pub mod game_state;
24pub mod hello_client;
26pub mod lightsaber_chosen;
28pub mod lightsaber_options;
30pub mod lobby_info;
32pub mod movement;
34pub mod pause_request;
36pub mod placement_complete;
38pub mod player_character;
40pub mod reconnect;
42pub mod serde_impls;
44pub mod text_broadcast;
46pub mod text_message;
48pub mod unit_chosen;
50pub mod unit_options;
52
53pub(self) use serde::{Deserialize, Serialize};
54pub(self) use std::fmt::{Display, Formatter, Result as FmtResult};
55
56use std::error::Error;
57
58#[derive(Deserialize, Debug)]
65#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
66#[serde(tag = "messageType")]
67pub enum RxMessage {
68 CharacterChosen(character_chosen::CharacterChosen),
69 LightsaberChosen(lightsaber_chosen::LightsaberChosen),
70 UnitChosen(unit_chosen::UnitChosen),
71 PlacementComplete(placement_complete::PlacementComplete),
72 ConnectGame(connect_game::ConnectGame),
73 PauseRequest(pause_request::PauseRequest),
74 HelloServer,
75 LeaveLobby,
76 Ready,
77 Reconnect(reconnect::Reconnect),
78 TextMessage(text_message::TextMessage),
79}
80
81impl RxMessage {
82 pub fn from_str(msg: &str) -> Result<Self, RxError> {
84 let parsed_msg = serde_json::from_str(msg)?;
85
86 match &parsed_msg {
87 Self::ConnectGame(msg) => msg.validate()?,
88 Self::CharacterChosen(_)
89 | Self::LightsaberChosen(_)
90 | Self::UnitChosen(_)
91 | Self::PlacementComplete(_)
92 | Self::PauseRequest(_)
93 | Self::HelloServer
94 | Self::LeaveLobby
95 | Self::Ready
96 | Self::Reconnect(_)
97 | Self::TextMessage(_) => (), }
99
100 Ok(parsed_msg)
101 }
102}
103
104#[derive(Debug)]
105pub enum RxError {
106 InvalidMessage(serde_json::Error),
109 ConnectGame(connect_game::ConnectGameError),
110}
111
112impl Error for RxError {}
113
114impl Display for RxError {
115 fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult {
116 match self {
117 Self::InvalidMessage(e) => write!(fmt, "Invalid Message: {}", e),
118 Self::ConnectGame(e) => write!(fmt, "CONNECT_GAME: {}", e),
119 }
120 }
121}
122
123impl From<serde_json::Error> for RxError {
124 fn from(e: serde_json::Error) -> RxError {
125 Self::InvalidMessage(e)
126 }
127}
128
129impl From<connect_game::ConnectGameError> for RxError {
130 fn from(e: connect_game::ConnectGameError) -> RxError {
131 Self::ConnectGame(e)
132 }
133}
134
135pub trait MessageTx {
136 fn serialize(&self) -> String;
137}
138
139pub fn serialize<T>(value: &T) -> String
140where
141 T: Serialize,
142{
143 serde_json::ser::to_string(value).expect("unserializable value encountered")
144}
145
146pub fn deserialize<'a, T>(value: &'a str) -> Result<T, serde_json::Error>
147where
148 T: Deserialize<'a>,
149{
150 serde_json::de::from_str(value)
151}