Represent opcodes as enum instead of u32

This commit is contained in:
Patrick Auernig 2018-03-23 22:24:06 +01:00
parent 8929bd4f96
commit 00c61cfa72
5 changed files with 18 additions and 12 deletions

View File

@ -1,6 +1,6 @@
use std::io::Result;
use connection::Connection;
use models::Handshake;
use models::{Handshake, OpCode};
#[cfg(feature = "rich_presence")]
use models::{SetActivityArgs, SetActivity};
@ -31,7 +31,7 @@ impl<T> Client<T>
where F: FnOnce(SetActivity) -> SetActivity
{
let args = SetActivityArgs::command(f(SetActivity::new()));
self.socket.send(1, args)?;
self.socket.send(OpCode::Frame, args)?;
Ok(())
}
@ -40,7 +40,7 @@ impl<T> Client<T>
fn handshake(&mut self) -> Result<()> {
let client_id = self.client_id;
let version = self.version;
self.socket.send(0, Handshake::new(client_id, version))?;
self.socket.send(OpCode::Handshake, Handshake::new(client_id, version))?;
Ok(())
}
}

View File

@ -1,14 +1,14 @@
use std::io::Result;
use std::marker::Sized;
use std::fmt::Debug;
use models::Payload;
use models::{Payload, OpCode};
pub trait Connection
where Self: Sized
{
fn connect() -> Result<Self>;
fn send<T>(&mut self, opcode: u32, payload: T) -> Result<()>
fn send<T>(&mut self, opcode: OpCode, payload: T) -> Result<()>
where T: Payload + Debug;
fn recv(&mut self) -> Result<Vec<u8>>;

View File

@ -6,7 +6,7 @@ use std::env;
use std::fmt::Debug;
use models::Payload;
use models::Message;
use models::{Message, OpCode};
use super::base::Connection;
pub struct UnixConnection {
@ -41,7 +41,7 @@ impl Connection for UnixConnection {
Ok(Self { socket })
}
fn send<T>(&mut self, opcode: u32, payload: T) -> Result<()>
fn send<T>(&mut self, opcode: OpCode, payload: T) -> Result<()>
where T: Payload + Debug
{
debug!("payload: {:#?}", payload);
@ -49,7 +49,7 @@ impl Connection for UnixConnection {
Err(why) => error!("{:?}", why),
Ok(bytes) => {
self.socket.write_all(bytes.as_ref())?;
debug!("sent opcode: {}", opcode);
debug!("sent opcode: {:?}", opcode);
self.recv()?;
}
};

View File

@ -3,6 +3,12 @@ use byte::ctx::{Endian, LE, Str};
use serde_json;
use serde::Serialize;
#[derive(Debug, Copy, Clone)]
pub enum OpCode {
Handshake,
Frame,
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
#[repr(C)]
pub struct Message {
@ -31,11 +37,11 @@ impl TryWrite<Endian> for Message {
}
impl Message {
pub fn new<T>(opcode: u32, message: T) -> Self
pub fn new<T>(opcode: OpCode, message: T) -> Self
where T: Serialize
{
Message {
opcode,
opcode: opcode as u32,
message: serde_json::to_string(&message).unwrap()
}
}
@ -65,7 +71,7 @@ mod tests {
#[test]
fn test_encoder() {
let msg = Message::new(1, Something { empty: true });
let msg = Message::new(OpCode::Frame, Something { empty: true });
let encoded = msg.encode().unwrap();
let decoded = Message::decode(encoded.as_ref()).unwrap();
assert_eq!(msg, decoded);

View File

@ -5,7 +5,7 @@ mod handshake;
mod set_activity;
use serde::Serialize;
pub use self::message::Message;
pub use self::message::{Message, OpCode};
pub use self::command::Command;
pub use self::handshake::Handshake;
#[cfg(feature = "rich_presence")]