diff options
| author | Austin Hellyer <[email protected]> | 2016-10-22 16:02:23 -0700 |
|---|---|---|
| committer | Austin Hellyer <[email protected]> | 2016-10-22 16:02:23 -0700 |
| commit | 163ad13c14835f1b353c71151eaf78db9c9280a6 (patch) | |
| tree | 4fd4d98530e7b6434787cc06804a7b320979d590 /src/model | |
| parent | Add ability to fully set a presence (diff) | |
| download | serenity-163ad13c14835f1b353c71151eaf78db9c9280a6.tar.xz serenity-163ad13c14835f1b353c71151eaf78db9c9280a6.zip | |
Abstract opcodes to enums
Diffstat (limited to 'src/model')
| -rw-r--r-- | src/model/gateway.rs | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/model/gateway.rs b/src/model/gateway.rs index 2e1b300..b267164 100644 --- a/src/model/gateway.rs +++ b/src/model/gateway.rs @@ -1,6 +1,7 @@ use std::collections::{BTreeMap, HashMap}; use super::utils::*; use super::*; +use ::constants::{OpCode, VoiceOpCode}; use ::prelude::*; use ::utils::decode_array; @@ -304,23 +305,29 @@ pub enum GatewayEvent { impl GatewayEvent { pub fn decode(value: Value) -> Result<Self> { let mut value = try!(into_map(value)); - match req!(value.get("op").and_then(|x| x.as_u64())) { - 0 => Ok(GatewayEvent::Dispatch( + + let op = req!(value.get("op").and_then(|x| x.as_u64())); + + match try!(OpCode::from_num(op as u8)) { + OpCode::Event => Ok(GatewayEvent::Dispatch( req!(try!(remove(&mut value, "s")).as_u64()), try!(Event::decode( try!(remove(&mut value, "t").and_then(into_string)), try!(remove(&mut value, "d")) )) )), - 1 => Ok(GatewayEvent::Heartbeat(req!(try!(remove(&mut value, "s")).as_u64()))), - 7 => Ok(GatewayEvent::Reconnect), - 9 => Ok(GatewayEvent::InvalidateSession), - 10 => { + OpCode::Heartbeat => { + Ok(GatewayEvent::Heartbeat(req!(try!(remove(&mut value, "s")) + .as_u64()))) + }, + OpCode::Reconnect => Ok(GatewayEvent::Reconnect), + OpCode::InvalidSession => Ok(GatewayEvent::InvalidateSession), + OpCode::Hello => { let mut data = try!(remove(&mut value, "d").and_then(into_map)); let interval = req!(try!(remove(&mut data, "heartbeat_interval")).as_u64()); Ok(GatewayEvent::Hello(interval)) }, - 11 => Ok(GatewayEvent::HeartbeatAck), + OpCode::HeartbeatAck => Ok(GatewayEvent::HeartbeatAck), _ => Err(Error::Decode("Unexpected opcode", Value::Object(value))), } } @@ -352,33 +359,35 @@ impl VoiceEvent { let mut value = try!(into_map(value)); let op = req!(try!(remove(&mut value, "op")).as_u64()); - if op == 3 { + let op = try!(VoiceOpCode::from_num(op as u8)); + + if op == VoiceOpCode::Heartbeat { return Ok(VoiceEvent::KeepAlive) } let mut value = try!(remove(&mut value, "d").and_then(into_map)); - if op == 2 { + if op == VoiceOpCode::Hello { missing!(value, VoiceEvent::Handshake { heartbeat_interval: req!(try!(remove(&mut value, "heartbeat_interval")).as_u64()), modes: try!(decode_array(try!(remove(&mut value, "modes")), into_string)), port: req!(try!(remove(&mut value, "port")).as_u64()) as u16, ssrc: req!(try!(remove(&mut value, "ssrc")).as_u64()) as u32, }) - } else if op == 4 { + } else if op == VoiceOpCode::SessionDescription { missing!(value, VoiceEvent::Ready { mode: try!(remove(&mut value, "mode").and_then(into_string)), secret_key: try!(decode_array(try!(remove(&mut value, "secret_key")), |v| Ok(req!(v.as_u64()) as u8) )), }) - } else if op == 5 { + } else if op == VoiceOpCode::Speaking { missing!(value, VoiceEvent::SpeakingUpdate { user_id: try!(remove(&mut value, "user_id").and_then(UserId::decode)), ssrc: req!(try!(remove(&mut value, "ssrc")).as_u64()) as u32, speaking: req!(try!(remove(&mut value, "speaking")).as_bool()), }) } else { - Ok(VoiceEvent::Unknown(op, Value::Object(value))) + Ok(VoiceEvent::Unknown(op as u64, Value::Object(value))) } } } |