zero_trust_rps/common/rps/
move_kind.rs

1use 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}