use bitflags::bitflags;
use bytes::Bytes;
use crate::error::ErrorCode;
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub(crate) struct Flags: u16 {
const SYN = 1 << 0;
const ACK = 1 << 1;
const FIN = 1 << 2;
const RST = 1 << 3;
}
}
#[derive(Debug, Clone)]
pub(crate) enum Frame {
Data {
stream_id: u32,
flags: Flags,
payload: Bytes,
},
WindowUpdate {
stream_id: u32,
flags: Flags,
delta: u32,
},
Ping { flags: Flags, opaque: u32 },
GoAway { error_code: ErrorCode },
}
impl Frame {
pub(crate) fn data(stream_id: u32, flags: Flags, payload: Bytes) -> Self {
Frame::Data {
stream_id,
flags,
payload,
}
}
pub(crate) fn syn(stream_id: u32) -> Self {
Frame::Data {
stream_id,
flags: Flags::SYN,
payload: Bytes::new(),
}
}
pub(crate) fn ack(stream_id: u32) -> Self {
Frame::Data {
stream_id,
flags: Flags::ACK,
payload: Bytes::new(),
}
}
pub(crate) fn fin(stream_id: u32) -> Self {
Frame::Data {
stream_id,
flags: Flags::FIN,
payload: Bytes::new(),
}
}
pub(crate) fn rst(stream_id: u32) -> Self {
Frame::Data {
stream_id,
flags: Flags::RST,
payload: Bytes::new(),
}
}
pub(crate) fn window_update(stream_id: u32, delta: u32) -> Self {
Frame::WindowUpdate {
stream_id,
flags: Flags::empty(),
delta,
}
}
pub(crate) fn ping(opaque: u32) -> Self {
Frame::Ping {
flags: Flags::empty(),
opaque,
}
}
pub(crate) fn pong(opaque: u32) -> Self {
Frame::Ping {
flags: Flags::ACK,
opaque,
}
}
pub(crate) fn go_away(error_code: ErrorCode) -> Self {
Frame::GoAway { error_code }
}
}