zero_trust_rps/common/rps/
move_kind.rs1use crate::common::message::ClientMessage;
2
3use super::state::{RpsState, UserMoveMethods};
4
5#[repr(u8)]
6pub enum UserMoveKind {
7 JoinRoom,
8 Play,
9 ConfirmPlay,
10 BackToRoom,
11}
12
13impl UserMoveMethods for UserMoveKind {
14 #[inline]
15 fn allowed_state(&self) -> RpsState {
16 use UserMoveKind::*;
17 match self {
18 JoinRoom => RpsState::BeforeRoom,
19 Play => RpsState::InRoom,
20 ConfirmPlay => RpsState::Played,
21 BackToRoom => RpsState::Confirmed,
22 }
23 }
24
25 #[inline]
26 fn resulting_state(&self) -> RpsState {
27 use UserMoveKind::*;
28 match self {
29 JoinRoom => RpsState::InRoom,
30 Play => RpsState::Played,
31 ConfirmPlay => RpsState::Confirmed,
32 BackToRoom => RpsState::InRoom,
33 }
34 }
35}
36
37impl UserMoveKind {
38 #[allow(dead_code)]
39 pub fn from_client_message(message: &ClientMessage) -> Option<UserMoveKind> {
40 message.try_into().ok()
41 }
42}
43
44impl TryFrom<&ClientMessage> for UserMoveKind {
45 type Error = ();
46
47 #[inline]
48 fn try_from(value: &ClientMessage) -> Result<Self, Self::Error> {
49 use ClientMessage::*;
50 match value {
51 Ping { c: _ } => Err(()),
52 Join {
53 room_id: _,
54 user: _,
55 } => Ok(UserMoveKind::JoinRoom),
56 Play { value: _, round: _ } => Ok(UserMoveKind::Play),
57 ConfirmPlay(_) => Ok(UserMoveKind::ConfirmPlay),
58 RoundFinished { round_id: _ } => Ok(UserMoveKind::BackToRoom),
59 }
60 }
61}