zero_trust_rps/common/rps/
move_kind.rsuse crate::common::message::ClientMessage;
use super::state::{RpsState, UserMoveMethods};
#[repr(u8)]
pub enum UserMoveKind {
JoinRoom,
Play,
ConfirmPlay,
BackToRoom,
}
impl UserMoveMethods for UserMoveKind {
#[inline]
fn allowed_state(&self) -> RpsState {
use UserMoveKind::*;
match self {
JoinRoom => RpsState::BeforeRoom,
Play => RpsState::InRoom,
ConfirmPlay => RpsState::Played,
BackToRoom => RpsState::Confirmed,
}
}
#[inline]
fn resulting_state(&self) -> RpsState {
use UserMoveKind::*;
match self {
JoinRoom => RpsState::InRoom,
Play => RpsState::Played,
ConfirmPlay => RpsState::Confirmed,
BackToRoom => RpsState::InRoom,
}
}
}
impl UserMoveKind {
#[allow(dead_code)]
pub fn from_client_message(message: &ClientMessage) -> Option<UserMoveKind> {
message.try_into().ok()
}
}
impl TryFrom<&ClientMessage> for UserMoveKind {
type Error = ();
#[inline]
fn try_from(value: &ClientMessage) -> Result<Self, Self::Error> {
use ClientMessage::*;
match value {
Ping { c: _ } => Err(()),
Join {
room_id: _,
user: _,
} => Ok(UserMoveKind::JoinRoom),
Play { value: _, round: _ } => Ok(UserMoveKind::Play),
ConfirmPlay(_) => Ok(UserMoveKind::ConfirmPlay),
RoundFinished { round_id: _ } => Ok(UserMoveKind::BackToRoom),
}
}
}