use std::default;
use bytes::BytesMut;
use fastwebsockets::{Frame, OpCode, Payload};
#[derive(Debug)]
pub struct OwnedFrame
{
pub fin: bool,
pub opcode: OpCode,
pub payload: Vec<u8>
}
impl OwnedFrame
{
pub fn new() -> Self
{
Self
{
fin: Default::default(),
opcode: OpCode::Continuation,
payload: Default::default()
}
}
pub fn with_capacity(capacity: usize) -> Self
{
Self
{
fin: Default::default(),
opcode: OpCode::Continuation,
payload: Vec::with_capacity(capacity)
}
}
pub fn from_frame(frame: &mut Frame<'_>) -> Self
{
let mut payload = Vec::new();
frame.write(&mut payload);
Self
{
fin: frame.fin,
opcode: frame.opcode,
payload
}
}
pub fn copy_all_from_read_frame(&mut self, frame: &Frame<'_>)
{
self.fin = frame.fin;
self.opcode = frame.opcode;
self.copy_payload_from_read_frame(frame);
}
pub fn copy_payload_from_read_frame(&mut self, frame: &Frame<'_>)
{
let payload = &mut self.payload;
let frame_payload_len = frame.payload.len();
if payload.len() != frame_payload_len
{
payload.resize(frame_payload_len, 0)
}
payload.copy_from_slice(&frame.payload);
}
pub fn copy_payload_from_other(&mut self, other: &Self)
{
let payload = &mut self.payload;
let frame_payload_len = other.payload.len();
if payload.len() != frame_payload_len
{
payload.resize(frame_payload_len, 0)
}
payload.copy_from_slice(&other.payload);
}
pub fn copy_all_from_other(&mut self, other: &Self)
{
self.fin = other.fin;
self.opcode = other.opcode;
self.copy_payload_from_other(&other);
}
pub fn reset(&mut self,)
{
self.fin = false;
self.opcode = OpCode::Continuation;
self.payload.clear();
}
pub fn setup_frame_to_be_written<'f>(&'f mut self, frame: &mut Frame<'f>)
{
frame.fin = self.fin;
frame.opcode = self.opcode;
frame.payload = Payload::BorrowedMut(&mut self.payload);
}
pub fn new_frame_to_be_written(&mut self) -> Frame
{
let mut frame = Frame::new(false, OpCode::Continuation, None, vec![].into());
self.setup_frame_to_be_written(&mut frame);
frame
}
pub fn continuation_setup(&mut self)
{
self.opcode = OpCode::Continuation;
self.fin = false;
}
pub fn final_continuation_setup(&mut self)
{
self.opcode = OpCode::Continuation;
self.fin = true;
}
pub fn text_setup(&mut self)
{
self.opcode = OpCode::Text;
self.fin = true;
}
pub fn text_continuation_stater_setup(&mut self)
{
self.opcode = OpCode::Text;
self.fin = false;
}
pub fn binary_setup(&mut self)
{
self.opcode = OpCode::Binary;
self.fin = true;
}
pub fn binary_continuation_stater_setup(&mut self)
{
self.opcode = OpCode::Binary;
self.fin = false;
}
pub fn close_setup(&mut self)
{
self.opcode = OpCode::Close;
self.fin = true;
}
pub fn ping_setup(&mut self)
{
self.opcode = OpCode::Ping;
self.fin = true;
}
pub fn pong_setup(&mut self)
{
self.opcode = OpCode::Pong;
self.fin = true;
}
pub fn pong_setup_with_payload(&mut self, frame: &Frame<'_>)
{
self.pong_setup();
self.copy_payload_from_read_frame(frame);
}
pub fn set_payload_from_str(&mut self, contents: &str)
{
let content_bytes = contents.as_bytes();
let payload = &mut self.payload;
let cb_len = content_bytes.len();
if cb_len != payload.len()
{
payload.resize(cb_len, 0);
}
payload.copy_from_slice(content_bytes);
}
pub fn set_payload_from_bytes(&mut self, contents: &[u8])
{
let payload = &mut self.payload;
let cb_len = contents.len();
if cb_len != payload.len()
{
payload.resize(cb_len, 0);
}
payload.copy_from_slice(contents);
}
pub fn clear_payload(&mut self)
{
self.payload.clear();
}
}