zero-trust-rps 0.0.5

Online Multiplayer Rock Paper Scissors
Documentation
use thiserror::Error;

use crate::common::connection::{GetNextMessageError, Reader};
use crate::common::message::RoomState;
use crate::common::message::ServerMessage;

use super::super::channel::{AsyncChannelSender, SendError};

#[derive(Debug)]
pub enum SimplifiedServerMessage {
    NewRoomState(RoomState),
    Pong(u8),
    #[allow(unused)]
    Error(String),
}

#[derive(Error, Debug)]
pub enum ReadMessagesError {
    #[error("{}", .0)]
    ReadingFailed(#[from] GetNextMessageError),
    #[error("{}", .0)]
    SendError(#[from] SendError),
    #[error("Got unexpected {} from server", .0)]
    UnexpectedServerMessage(&'static str),
}

pub async fn read_server_messages(
    mut conn: impl Reader,
    sender: impl AsyncChannelSender<SimplifiedServerMessage>,
) -> Result<(), ReadMessagesError> {
    use crate::common::message::ServerMessage::*;
    log::debug!(
        "read_server_messages on thread {:?}",
        std::thread::current().id()
    );
    while let Some(msg) = conn.get_next_message::<ServerMessage>().await? {
        log::debug!("Thread {:?} recieved: {msg:?}", std::thread::current().id());
        match msg {
            Hello(_, _, _) => return Err(ReadMessagesError::UnexpectedServerMessage("hello")),
            // Ping { s } => tcp_sender.send(ClientMessage::Pong { s }).await?,
            Pong { c } => sender.send(SimplifiedServerMessage::Pong(c)).await?,
            RoomUpdate { new_state } => {
                sender
                    .send(SimplifiedServerMessage::NewRoomState(new_state))
                    .await?
            }
            Error(string) => sender.send(SimplifiedServerMessage::Error(string)).await?,
        }
    }

    Ok(())
}