use bevy::log::error;
use crate::{
client::{connection::ClientSideConnection, ClientSendError, ConnectionClosed},
shared::channels::ChannelId,
};
#[derive(thiserror::Error, Debug)]
pub enum ClientMessageSendError {
#[error("Failed serialization")]
Serialization,
#[error("There is no default channel")]
NoDefaultChannel,
#[error("Error when sending data")]
SendError(#[from] ClientSendError),
}
#[derive(thiserror::Error, Debug)]
pub enum ClientMessageReceiveError {
#[error("Failed deserialization")]
Deserialization,
#[error("There is no default channel")]
NoDefaultChannel,
#[error("Error while receiving data")]
ConnectionClosed(#[from] ConnectionClosed),
}
impl ClientSideConnection {
pub fn receive_message<T: serde::de::DeserializeOwned>(
&mut self,
) -> Result<Option<T>, ClientMessageReceiveError> {
match self.default_channel() {
Some(channel) => self.receive_message_on(channel),
None => Err(ClientMessageReceiveError::NoDefaultChannel),
}
}
pub fn try_receive_message<T: serde::de::DeserializeOwned>(&mut self) -> Option<T> {
match self.receive_message() {
Ok(message) => message,
Err(err) => {
error!("try_receive_message: {}", err);
None
}
}
}
pub fn receive_message_on<T: serde::de::DeserializeOwned, C: Into<ChannelId>>(
&mut self,
channel_id: C,
) -> Result<Option<T>, ClientMessageReceiveError> {
match self.receive_payload(channel_id)? {
Some(payload) => {
match bincode::serde::decode_from_slice(&payload, bincode::config::standard()) {
Ok((msg, _size)) => Ok(Some(msg)),
Err(_) => Err(ClientMessageReceiveError::Deserialization),
}
}
None => Ok(None),
}
}
pub fn try_receive_message_on<T: serde::de::DeserializeOwned, C: Into<ChannelId>>(
&mut self,
channel_id: C,
) -> Option<T> {
match self.receive_message_on(channel_id) {
Ok(message) => message,
Err(err) => {
error!("try_receive_message: {}", err);
None
}
}
}
pub fn send_message_on<T: serde::Serialize, C: Into<ChannelId>>(
&mut self,
channel_id: C,
message: T,
) -> Result<(), ClientMessageSendError> {
match bincode::serde::encode_to_vec(&message, bincode::config::standard()) {
Ok(payload) => Ok(self.send_payload_on(channel_id, payload)?),
Err(_) => Err(ClientMessageSendError::Serialization),
}
}
pub fn send_message<T: serde::Serialize>(
&mut self,
message: T,
) -> Result<(), ClientMessageSendError> {
match self.default_channel() {
Some(channel) => self.send_message_on(channel, message),
None => Err(ClientMessageSendError::NoDefaultChannel),
}
}
pub fn try_send_message<T: serde::Serialize>(&mut self, message: T) {
if let Err(err) = self.send_message(message) {
error!("try_send_message: {}", err);
}
}
pub fn try_send_message_on<T: serde::Serialize, C: Into<ChannelId>>(
&mut self,
channel_id: C,
message: T,
) {
if let Err(err) = self.send_message_on(channel_id, message) {
error!("try_send_message_on: {}", err);
}
}
}