aboutsummaryrefslogtreecommitdiff
path: root/src/internal/ws_impl.rs
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2017-11-19 09:53:59 -0800
committerZeyla Hellyer <[email protected]>2017-11-19 09:53:59 -0800
commitc3aa63faee8b3ae6d5126aa27a74876766c61e4c (patch)
tree560ae5fcf011a8bb7cbaa5e4a5fc3bb2ee89ee31 /src/internal/ws_impl.rs
parentAdd `model::Reaction::user` (diff)
downloadserenity-c3aa63faee8b3ae6d5126aa27a74876766c61e4c.tar.xz
serenity-c3aa63faee8b3ae6d5126aa27a74876766c61e4c.zip
Implement Deserialize for {,Gateway,Voice}Event
Implement Deserialize for `model::event::GatewayEvent` and `model::event::VoiceEvent`, and derive it for `model::event::Event`. Due to the natural potential slowness of deserializing into`Event` (attempting to deserialize into each variant until successful), a function named `model::event::deserialize_event_with_type` is provided for quickly deserializing into a known type if the dispatch type is known.
Diffstat (limited to 'src/internal/ws_impl.rs')
-rw-r--r--src/internal/ws_impl.rs24
1 files changed, 4 insertions, 20 deletions
diff --git a/src/internal/ws_impl.rs b/src/internal/ws_impl.rs
index c1ac83b..8988e06 100644
--- a/src/internal/ws_impl.rs
+++ b/src/internal/ws_impl.rs
@@ -7,8 +7,7 @@ use websocket::sync::stream::{TcpStream, TlsStream};
use websocket::sync::Client as WsClient;
pub trait ReceiverExt {
- fn recv_json<F, T>(&mut self, decode: F) -> Result<Option<T>>
- where F: Fn(Value) -> Result<T>;
+ fn recv_json(&mut self) -> Result<Option<Value>>;
}
pub trait SenderExt {
@@ -16,29 +15,14 @@ pub trait SenderExt {
}
impl ReceiverExt for WsClient<TlsStream<TcpStream>> {
- fn recv_json<F, T>(&mut self, decode: F) -> Result<Option<T>>
- where F: Fn(Value) -> Result<T> {
+ fn recv_json(&mut self) -> Result<Option<Value>> {
Ok(match self.recv_message()? {
OwnedMessage::Binary(bytes) => {
- let value = serde_json::from_reader(ZlibDecoder::new(&bytes[..]))?;
-
- Some(decode(value).map_err(|why| {
- let s = String::from_utf8_lossy(&bytes);
-
- warn!("(╯°□°)╯︵ ┻━┻ Error decoding: {}", s);
-
- why
- })?)
+ serde_json::from_reader(ZlibDecoder::new(&bytes[..])).map(Some)?
},
OwnedMessage::Close(data) => return Err(Error::Gateway(GatewayError::Closed(data))),
OwnedMessage::Text(payload) => {
- let value = serde_json::from_str(&payload)?;
-
- Some(decode(value).map_err(|why| {
- warn!("(╯°□°)╯︵ ┻━┻ Error decoding: {}", payload);
-
- why
- })?)
+ serde_json::from_str(&payload).map(Some)?
},
OwnedMessage::Ping(x) => {
self.send_message(&OwnedMessage::Pong(x))