use std::cmp;
use std::convert;
use std::fmt;
use std::hash;
#[derive(Clone, Copy, Debug)]
pub enum Opcode {
Query,
IQuery,
Status,
Notify,
Update,
Dso,
Int(u8)
}
impl Opcode {
pub fn from_int(value: u8) -> Opcode {
use self::Opcode::*;
match value & 0x0F {
0 => Query,
1 => IQuery,
2 => Status,
4 => Notify,
5 => Update,
6 => Dso,
value => Int(value)
}
}
pub fn to_int(self) -> u8 {
use self::Opcode::*;
match self {
Query => 0,
IQuery => 1,
Status => 2,
Notify => 4,
Update => 5,
Dso => 6,
Int(value) => value & 0x0F
}
}
}
impl convert::From<u8> for Opcode {
fn from(value: u8) -> Opcode { Opcode::from_int(value) }
}
impl convert::From<Opcode> for u8 {
fn from(value: Opcode) -> u8 { Opcode::to_int(value) }
}
impl fmt::Display for Opcode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::Opcode::*;
match *self {
Query => "QUERY".fmt(f),
IQuery => "IQUERY".fmt(f),
Status => "STATUS".fmt(f),
Notify => "NOTIFY".fmt(f),
Update => "UPDATE".fmt(f),
Dso => "DSO".fmt(f),
Int(value) => {
match Opcode::from_int(value) {
Int(value) => value.fmt(f),
value => value.fmt(f)
}
}
}
}
}
impl cmp::PartialEq for Opcode {
fn eq(&self, other: &Opcode) -> bool {
self.to_int() == other.to_int()
}
}
impl cmp::PartialEq<u8> for Opcode {
fn eq(&self, other: &u8) -> bool {
self.to_int() == *other
}
}
impl cmp::PartialEq<Opcode> for u8 {
fn eq(&self, other: &Opcode) -> bool {
*self == other.to_int()
}
}
impl cmp::Eq for Opcode { }
impl cmp::PartialOrd for Opcode {
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
self.to_int().partial_cmp(&other.to_int())
}
}
impl cmp::PartialOrd<u8> for Opcode {
fn partial_cmp(&self, other: &u8) -> Option<cmp::Ordering> {
self.to_int().partial_cmp(other)
}
}
impl cmp::PartialOrd<Opcode> for u8 {
fn partial_cmp(&self, other: &Opcode) -> Option<cmp::Ordering> {
self.partial_cmp(&other.to_int())
}
}
impl cmp::Ord for Opcode {
fn cmp(&self, other: &Self) -> cmp::Ordering {
self.to_int().cmp(&other.to_int())
}
}
impl hash::Hash for Opcode {
fn hash<H: hash::Hasher>(&self, state: &mut H) {
self.to_int().hash(state)
}
}