aboutsummaryrefslogtreecommitdiff
path: root/src/client/bridge
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/client/bridge
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/client/bridge')
-rw-r--r--src/client/bridge/gateway/shard_runner.rs9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/client/bridge/gateway/shard_runner.rs b/src/client/bridge/gateway/shard_runner.rs
index 005f321..15712f3 100644
--- a/src/client/bridge/gateway/shard_runner.rs
+++ b/src/client/bridge/gateway/shard_runner.rs
@@ -3,6 +3,7 @@ use internal::prelude::*;
use internal::ws_impl::ReceiverExt;
use model::event::{Event, GatewayEvent};
use parking_lot::Mutex;
+use serde::Deserialize;
use std::sync::mpsc::{self, Receiver, Sender, TryRecvError};
use std::sync::Arc;
use super::super::super::{EventHandler, dispatch};
@@ -329,7 +330,11 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> {
/// Returns a received event, as well as whether reading the potentially
/// present event was successful.
fn recv_event(&mut self) -> (Option<Event>, Option<ShardAction>, bool) {
- let gw_event = match self.shard.client.recv_json(GatewayEvent::decode) {
+ let gw_event = match self.shard.client.recv_json() {
+ Ok(Some(value)) => {
+ GatewayEvent::deserialize(value).map(Some).map_err(From::from)
+ },
+ Ok(None) => Ok(None),
Err(Error::WebSocket(WebSocketError::IoError(_))) => {
// Check that an amount of time at least double the
// heartbeat_interval has passed.
@@ -366,7 +371,7 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> {
// hit every iteration.
return (None, None, false);
},
- other => other,
+ Err(why) => Err(why),
};
let event = match gw_event {