use futures::{FutureExt, StreamExt};
use serde::{Serialize};
use ws_stream_wasm::WsMessage;
#[macro_export]
macro_rules! send {
($writer:expr,$pkt:expr) => {
$writer.send($crate::macros::__generic_packet_to_message($pkt).unwrap())
};
}
#[macro_export]
macro_rules! recv {
($reader:expr) => {
{
if let Some(future_result) = $reader.next().now_or_never() {
if let Some(msg) = future_result {
if let WsMessage::Binary(msg) = msg {
match rmp_serde::from_slice(&msg) {
Ok(d) => Ok(Some(d)),
Err(e) => {
log::error!("error deserializing message: {}", e);
Ok(None)
}
}
} else {
Ok(None)
}
} else {
log::error!("pipe closed");
Err("Pipe closed")
}
} else {
Ok(None)
}
}
}
}
#[macro_export]
macro_rules! recv_now {
($reader:expr) => {
{
if let Some(msg) = $reader.next().await {
if let WsMessage::Binary(msg) = msg {
match rmp_serde::from_slice(&msg) {
Ok(d) => Ok(Some(d)),
Err(e) => {
log::error!("error deserializing message: {}", e);
Ok(None)
}
}
} else {
Ok(None)
}
} else {
log::error!("pipe closed");
Err("Pipe closed")
}
}
};
}
pub fn __generic_packet_to_message<T: Serialize>(pkt: &T) -> Result<WsMessage, rmp_serde::encode::Error> {
rmp_serde::to_vec(&pkt).map(WsMessage::from)
}