use core::fmt::Display; use alloc::collections::VecDeque; use kernel::proccess::PID; use crate::{arch::generate_process_pass, handle::Handle}; #[derive(Debug)] pub struct ChannelPermission { pub owner: bool, pub producer: bool, pub consumer: bool, /// Whether or not the process can be destructive about reading pub distructive_consumer: bool, } #[derive(Debug)] pub struct Channel { inner: VecDeque, // TODO(able): change this to a hashmap i think permission_list: Vec<(PID, ChannelPermission)>, } impl Channel { pub fn new() -> Self { let deq = VecDeque::from([]); Self { inner: deq, permission_list: vec![], } } pub fn read(&mut self) -> Result { if let Some(abc) = self.inner.pop_front() { return Ok(abc); } return Err(ChannelError::EmptyBuffer); } pub fn send(&mut self, data: u8) { self.inner.push_back(data); } } pub enum ChannelError { EmptyBuffer, InvalidPermissions, }