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")),
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(())
}