geogamer_data 0.1.16

Data format description exchanged between geogamer server and client
Documentation
use std::collections::HashMap;

use serde::{Deserialize, Serialize};
use uuid::Uuid;

use crate::player;

pub type Id = Uuid;

/// GET /api/games
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListGamesResponse {
    pub games: Vec<Game>,
    pub is_before: bool,
    pub is_after: bool,
    pub total_games: usize,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Game {
    pub id: Id,
    pub state: GameState,
    pub players: HashMap<player::Id, player::Player>,
    pub player_states: HashMap<player::Id, PlayerState>,
    pub rounds: Vec<Round>,
}

/// Message broadcasted from server to clients
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GameServerEvent {
    State(GameState),                               //< current game state
    PlayerStates(HashMap<player::Id, PlayerState>), //< current state (lives, score, etc) of players
    CorrectGuess,                                   //< client guessed correctly
    IncorrectGuess,                                 //< client guessed wrong
    CloseGuess,                                     //< client's guess was close to correct
    RoundTick(u32),                                 //< round timer tick
    RoundRecapTick(u32),                            //< round recap timer tick
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GameState {
    Starting(u32),                             //< current countdown before game starts
    Ongoing(Option<u32>, usize, usize, Round), //< optional round timer, round index, total number of rounds, current round
    RoundRecap(Option<u32>, usize, RoundInfo), //< optional countdown before next round, round index, round info
    Ending,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PlayerState {
    pub name: String,
    pub guess_state: GuessState,
    pub score: i32,
    pub lives: u8,
    pub is_afk: bool,
}

pub type PlayerStates = HashMap<player::Id, PlayerState>;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GuessState {
    Guessing,
    FinishedSuccess,
    FinishedFailure,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Round {
    pub image_id: Id,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RoundInfo {
    pub game_name: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GameClientEvent {
    GameGuess(String),
    SkipRound,
}