use crate::system::notification::BUFF_SIZE;
use core::write;
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum Type {
Unknown,
Notification,
Syscall,
Application,
}
#[derive(Copy, Clone)]
pub struct Buffer {
pub btype: Type,
pub payload: [u8; BUFF_SIZE],
pub payload_idx: usize,
}
impl Default for Buffer {
fn default() -> Buffer {
Buffer {
btype: Type::Unknown,
payload: [0u8; BUFF_SIZE],
payload_idx: 0,
}
}
}
impl Buffer {
pub fn new(rx_buffer: [u8; BUFF_SIZE]) -> Self {
Buffer {
btype: Type::Unknown,
payload: rx_buffer,
payload_idx: 0,
}
}
pub fn get_type(&self) -> Type {
self.btype
}
pub fn write(&mut self, byte: u8) {
self.payload[self.payload_idx] = byte;
self.payload_idx += 1;
}
pub fn clear(&mut self) {
self.payload_idx = 0;
}
pub fn as_str(&self) -> &str {
unsafe { core::str::from_utf8_unchecked(&self.payload[0..self.payload_idx]) }
}
pub fn as_slice(&self) -> &[u8] {
&self.payload[0..self.payload_idx]
}
pub fn determine_type(&mut self, type_byte: u8) -> Type {
self.btype = match type_byte {
b'N' => Type::Notification,
b'S' => Type::Syscall,
b'A' => Type::Application,
_ => Type::Unknown,
};
self.btype
}
}
impl core::fmt::Debug for Buffer {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "Buffer<{:?}>[{}] : [", self.btype, self.payload_idx)?;
for idx in 0..self.payload_idx{
write!(f, " '{}',", self.payload[idx] as char)?;
}
write!(f, " ]")?;
Ok(())
}
}
impl core::fmt::Display for Buffer {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
for idx in 0..self.payload_idx{
write!(f, "{}", self.payload[idx] as char)?;
}
Ok(())
}
}