use flate2::read::ZlibDecoder; use crate::gateway::WsClient; use crate::internal::prelude::*; use serde_json; use tungstenite::Message; pub trait ReceiverExt { fn recv_json(&mut self) -> Result>; } pub trait SenderExt { fn send_json(&mut self, value: &Value) -> Result<()>; } impl ReceiverExt for WsClient { fn recv_json(&mut self) -> Result> { Ok(match self.read_message()? { Message::Binary(bytes) => { serde_json::from_reader(ZlibDecoder::new(&bytes[..])) .map(Some) .map_err(|why| { warn!("Err deserializing bytes: {:?}; bytes: {:?}", why, bytes); why })? }, Message::Text(payload) => { serde_json::from_str(&payload).map(Some).map_err(|why| { warn!( "Err deserializing text: {:?}; text: {}", why, payload, ); why })? }, Message::Ping(x) => { self.write_message(Message::Pong(x)).map_err(Error::from)?; None }, Message::Pong(_) => None, }) } } impl SenderExt for WsClient { fn send_json(&mut self, value: &Value) -> Result<()> { serde_json::to_string(value) .map(Message::Text) .map_err(Error::from) .and_then(|m| self.write_message(m).map_err(Error::from)) } }