Use Result value for OpCode conversion

Conversion could fail if integer is not in range 0...4.
This commit is contained in:
Patrick Auernig 2018-03-29 23:00:58 +02:00
parent 40be78dbd1
commit fd1dc15a29
1 changed files with 15 additions and 9 deletions

View File

@ -1,22 +1,28 @@
use std::io::{self, Write, Read, Result}; use std::io::{self, Write, Read};
use std::convert::From;
use byteorder::{WriteBytesExt, ReadBytesExt, LittleEndian}; use byteorder::{WriteBytesExt, ReadBytesExt, LittleEndian};
use serde_json; use serde_json;
use serde::Serialize; use serde::Serialize;
use error::{Result, Error};
#[derive(Debug, Copy, Clone, PartialEq)] #[derive(Debug, Copy, Clone, PartialEq)]
pub enum OpCode { pub enum OpCode {
Handshake, Handshake,
Frame, Frame,
Invalid, Close,
Ping,
Pong,
} }
impl From<u32> for OpCode { // FIXME: Use TryFrom trait when stable
fn from(int: u32) -> Self { impl OpCode {
fn try_from(int: u32) -> Result<Self> {
match int { match int {
0 => OpCode::Handshake, 0 => Ok(OpCode::Handshake),
1 => OpCode::Frame, 1 => Ok(OpCode::Frame),
_ => OpCode::Invalid, 2 => Ok(OpCode::Close),
3 => Ok(OpCode::Ping),
4 => Ok(OpCode::Pong),
_ => Err(Error::Conversion)
} }
} }
} }
@ -48,7 +54,7 @@ impl Message {
pub fn decode(bytes: &[u8]) -> Result<Self> { pub fn decode(bytes: &[u8]) -> Result<Self> {
let mut reader = io::Cursor::new(bytes); let mut reader = io::Cursor::new(bytes);
let mut message = String::new(); let mut message = String::new();
let opcode = OpCode::from(reader.read_u32::<LittleEndian>()?); let opcode = OpCode::try_from(reader.read_u32::<LittleEndian>()?)?;
reader.read_u32::<LittleEndian>()?; reader.read_u32::<LittleEndian>()?;
reader.read_to_string(&mut message)?; reader.read_to_string(&mut message)?;
Ok(Message { opcode, message }) Ok(Message { opcode, message })