use std::collections::HashMap;
use once_cell::sync::Lazy;
use super::logic::ping_pong_models::*;
use reactive_messaging::prelude::{ReactiveMessagingMemoryMappable, ReactiveMessagingConfig};
use serde::{Serialize, Deserialize};
pub static PROTOCOL_VERSIONS: Lazy<HashMap<VersionType, &str>> = Lazy::new(||
HashMap::from([
(1, "2024-02-19"),
(2, "2024-10-04"),
(3, "2025-10-08"),
]));
pub static PROTOCOL_VERSION: VersionType = 3;
type VersionType = u8;
#[derive(Debug,Clone)]
pub enum ProtocolStates {
PreGame,
Disconnect,
Game,
}
#[derive(Debug, PartialEq, Serialize, Deserialize, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
#[archive_attr(derive(Debug))]
#[archive_attr(derive(PartialEq))]
pub enum PreGameClientMessages {
Version(VersionType),
Config(MatchConfig),
Error(PreGameClientError),
}
impl Default for PreGameClientMessages {
fn default() -> Self {
Self::Error(PreGameClientError::SlotNotInitialized)
}
}
#[derive(Debug, PartialEq, Serialize, Deserialize, Default, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
#[archive_attr(derive(Debug))]
#[archive_attr(derive(PartialEq))]
pub enum GameClientMessages {
PingPongEvent(PingPongEvent),
EndorsedScore,
ContestedScore(MatchScore),
DumpConfig,
Error(GameClientError),
#[default]
Quit,
}
#[derive(Debug, PartialEq, Serialize, Deserialize, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
#[archive_attr(derive(Debug))]
#[archive_attr(derive(PartialEq))]
pub enum PreGameClientError {
SlotNotInitialized,
TextualProtocolProcessorParsingError,
InternalProcessorError,
IncompatibleProtocols,
}
#[derive(Debug, PartialEq, Serialize, Deserialize, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
#[archive_attr(derive(Debug))]
#[archive_attr(derive(PartialEq))]
pub enum GameClientError {
TextualProtocolProcessorParsingError,
InternalProcessorError,
}
#[derive(Debug, PartialEq, Serialize, Deserialize, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
#[archive_attr(derive(Debug))]
#[archive_attr(derive(PartialEq))]
pub enum PreGameServerMessages {
Version(VersionType),
Error(PreGameServerError),
}
impl Default for PreGameServerMessages {
fn default() -> Self {
Self::Version(PROTOCOL_VERSION)
}
}
#[derive(Debug, PartialEq, Serialize, Deserialize, Default, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
#[archive_attr(derive(Debug))]
#[archive_attr(derive(PartialEq))]
pub enum GameServerMessages {
GameStarted,
MatchConfig(MatchConfig),
PingPongEvent(PingPongEvent),
Error(GameServerError),
#[default]
GoodBye,
ServerShutdown,
}
#[derive(Debug, PartialEq, Serialize, Deserialize, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
#[archive_attr(derive(Debug))]
#[archive_attr(derive(PartialEq))]
pub enum PreGameServerError {
TextualProtocolProcessorParsingError,
AbortingDueToPeerError,
InternalProcessorError,
IncompatibleProtocols,
}
#[derive(Debug, PartialEq, Serialize, Deserialize, rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)]
#[archive_attr(derive(Debug))]
#[archive_attr(derive(PartialEq))]
pub enum GameServerError {
TextualProtocolProcessorParsingError,
InternalProcessorError,
}
impl AsRef<GameClientMessages> for GameClientMessages {
#[inline(always)]
fn as_ref(&self) -> &GameClientMessages {
self
}
}
impl AsRef<PreGameClientMessages> for PreGameClientMessages {
#[inline(always)]
fn as_ref(&self) -> &PreGameClientMessages {
self
}
}
impl ReactiveMessagingConfig<PreGameClientMessages> for PreGameClientMessages {
#[inline(always)]
fn processor_error_message(_err: String) -> Option<PreGameClientMessages> {
Some(PreGameClientMessages::Error(PreGameClientError::InternalProcessorError))
}
}
impl ReactiveMessagingConfig<GameClientMessages> for GameClientMessages {
#[inline(always)]
fn processor_error_message(_err: String) -> Option<GameClientMessages> {
Some(GameClientMessages::Error(GameClientError::InternalProcessorError))
}
}
impl AsRef<PreGameServerMessages> for PreGameServerMessages {
#[inline(always)]
fn as_ref(&self) -> &PreGameServerMessages {
self
}
}
impl AsRef<GameServerMessages> for GameServerMessages {
#[inline(always)]
fn as_ref(&self) -> &GameServerMessages {
self
}
}
impl ReactiveMessagingConfig<PreGameServerMessages> for PreGameServerMessages {
#[inline(always)]
fn processor_error_message(_err: String) -> Option<PreGameServerMessages> {
Some(PreGameServerMessages::Error(PreGameServerError::TextualProtocolProcessorParsingError))
}
}
impl ReactiveMessagingConfig<GameServerMessages> for GameServerMessages {
#[inline(always)]
fn processor_error_message(_err: String) -> Option<GameServerMessages> {
Some(GameServerMessages::Error(GameServerError::TextualProtocolProcessorParsingError))
}
}
impl ReactiveMessagingMemoryMappable for PreGameClientMessages {}
impl ReactiveMessagingMemoryMappable for GameClientMessages {}
impl ReactiveMessagingMemoryMappable for PreGameServerMessages {}
impl ReactiveMessagingMemoryMappable for GameServerMessages {}