use super::mask::Mask;
use super::super::core::traits::Serialize;
use bitflags::bitflags;
bitflags! {
#[derive(PartialEq, Eq, Clone)]
pub struct OPCODE: u8 {
const CONTINUATION = 0x0;
const TEXT = 0x1;
const BINARY = 0x2;
const CLOSE = 0x8;
const PING = 0x9;
const PONG = 0xA;
}
}
bitflags! {
#[derive(PartialEq, Eq, Clone, Copy)]
pub struct FLAG: u8 {
const FIN = 0x80; const NOFLAG = 0x00; const RSV1 = 0x40; const RSV2 = 0x20; const RSV3 = 0x10; }
}
pub struct Header {
flag: FLAG,
code: OPCODE,
mask_key: Option<Mask>,
payload_len: u64
}
impl Header {
pub fn new(flag: FLAG, code: OPCODE, mask_key: Option<Mask>, payload_len: u64) -> Self {
Header { flag, code, mask_key, payload_len }
}
pub fn get_mask(&self) -> Option<Mask> {
self.mask_key
}
pub fn get_opcode(&self) -> OPCODE {
self.code.clone()
}
pub fn get_flag(&self) -> FLAG {
self.flag
}
}
impl Serialize for Header {
fn serialize(&self) -> Vec<u8> {
let mut buffer: Vec<u8> = vec![];
let mut header1: u8 = self.flag.bits();
header1 |= self.code.bits();
buffer.push(header1);
let mut header2 = if self.mask_key.is_some() { 0b10000000 } else { 0b00000000 };
if self.payload_len < 125 {
header2 |= self.payload_len as u8;
buffer.push(header2);
} else if self.payload_len <= 65535 { header2 |= 126;
buffer.push(header2);
buffer.extend((self.payload_len as u16).to_be_bytes());
} else {
header2 |= 127; buffer.push(header2);
buffer.extend(self.payload_len.to_be_bytes());
}
if self.mask_key.is_some() {
let mask = self.mask_key.unwrap();
buffer.extend(mask);
}
return buffer;
}
}