use crate::bytes::BufMut;
use super::{
super::error::Error,
head::{Head, Kind},
stream_id::StreamId,
};
pub struct Ping {
pub payload: [u8; 8],
pub is_ack: bool,
}
impl Ping {
pub const fn new(payload: [u8; 8], is_ack: bool) -> Self {
Self { payload, is_ack }
}
pub fn load(head: Head, payload: &[u8]) -> Result<Ping, Error> {
if !head.stream_id().is_zero() {
return Err(Error::InvalidStreamId);
}
let is_ack = head.flag() & 0x1 == 0x1;
let payload = payload.try_into().map_err(|_| Error::BadFrameSize)?;
Ok(Ping { payload, is_ack })
}
pub fn encode<B>(&self, dst: &mut B)
where
B: BufMut,
{
let flag = if self.is_ack { 0x1 } else { 0x0 };
Head::new(Kind::Ping, flag, StreamId::zero()).encode(8, dst);
dst.put_slice(&self.payload);
}
}