zero-trust-rps 0.1.1

Online Multiplayer Rock Paper Scissors
Documentation
use std::{collections::HashMap, hash::Hash, sync::Arc};

use tokio::sync::Mutex;
use uuid::Uuid;

use crate::common::{
    message::{RoomId, Round, User},
    rps::{move_kind::UserMoveKind, move_validation},
};

pub(crate) type ArcMut<T> = Arc<Mutex<T>>;
pub(crate) type Connections<K, Conn> = ArcMut<HashMap<K, Conn>>;
pub(crate) type Rooms<K> = ArcMut<HashMap<RoomId, ArcMut<RoomData<K>>>>;

#[derive(Debug, Clone)]
pub struct RoomData<K: Hash> {
    pub users: HashMap<K, User>,
    pub round: Option<Round>,
}

impl<K: Hash> Default for RoomData<K> {
    fn default() -> Self {
        RoomData {
            users: HashMap::new(),
            round: None,
        }
    }
}

impl<K: Hash> RoomData<K> {
    pub fn validate_move(
        &self,
        user_id: Uuid,
        move_kind: UserMoveKind,
    ) -> Result<(), move_validation::MoveValidationError> {
        move_validation::validate_move(user_id, move_kind, self.users.values(), self.round.as_ref())
    }
}