diff options
| author | Zeyla Hellyer <[email protected]> | 2017-11-19 09:53:59 -0800 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-11-19 09:53:59 -0800 |
| commit | c3aa63faee8b3ae6d5126aa27a74876766c61e4c (patch) | |
| tree | 560ae5fcf011a8bb7cbaa5e4a5fc3bb2ee89ee31 /src/client/bridge | |
| parent | Add `model::Reaction::user` (diff) | |
| download | serenity-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.rs | 9 |
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 { |