use crate::constants;
pub(crate) struct Packet {
pub(crate) packet_type: u8,
pub(crate) packet_flags: u8,
pub(crate) data_flags: u16,
pub(crate) buf: Vec<u8>,
}
impl Packet {
pub(crate) fn has_end_of_response(&self) -> bool {
if self.packet_type != constants::PACKET_TYPE_DATA
|| self.data_flags & constants::TTC_DATA_FLAGS_END_OF_RESPONSE != 0
|| self.data_flags & constants::TTC_DATA_FLAGS_EOF != 0
{
true
} else if let Some(last_byte) = self.buf.last() {
*last_byte == constants::TTC_MSG_TYPE_END_OF_RESPONSE
} else {
false
}
}
pub(crate) fn has_reset_marker(&self) -> bool {
if self.packet_type == constants::PACKET_TYPE_MARKER {
self.buf[2] == constants::MARKER_TYPE_RESET
} else {
false
}
}
pub(crate) fn new(data: &[u8]) -> Packet {
let packet_type = data[4];
let packet_flags = data[5];
let mut data_flags: u16 = 0;
let mut buf = &data[8..];
if packet_type == constants::PACKET_TYPE_DATA {
data_flags = u16::from_be_bytes(data[8..10].try_into().unwrap());
buf = &data[10..];
}
Packet {
packet_type,
packet_flags,
data_flags,
buf: buf.into(),
}
}
}