use std::error::Error; use std::io; use futures::{AsyncRead, AsyncWrite, FutureExt, Stream, StreamExt}; use futures::stream::SplitStream; use serde::{Deserialize, Serialize}; use tokio_tungstenite::WebSocketStream; use tungstenite::Message; #[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 { match msg { Ok(msg) => { if msg.is_binary() { match rmp_serde::from_slice(&msg.into_data()) { Ok(d) => Ok(Some(d)), Err(e) => { log::error!("error deserializing message: {}", e); Ok(None) } } } else { Ok(None) } }, Err(e) => { log::error!("error receiving message: {}", e); Ok(None) } } } else { log::error!("pipe closed"); Err("Pipe closed") } } else { Ok(None) } } } } pub fn __generic_packet_to_message(pkt: &T) -> Result { rmp_serde::to_vec(&pkt).map(Message::from) }