//! Interprocess communication.

use crate::{proccess::PID, time::Time};

/// 128 Bytes
pub type Tiny = [u8; 128];

/// 1 KiB
pub type Small = [u8; 1024];

/// 65.536 KiB
pub type Medium = [u8; 65536];

/// 1MiB
pub type Large = [u8; 1048576];

/// 16MiB
pub type Huge = [u8; 16777216];

/// An internal message to be held in a process message
pub enum Message {
    /// A Tiny message
    ///
    /// The message is 128 bytes long
    Tiny(Tiny),
    /// A Small message
    ///
    /// The message is 1 KiB long
    Small(Small),
    /// A Medium message
    ///
    /// The message is 65.536 KiB long
    Medium(Medium),
    /// A Large message
    ///
    /// The message is 1 MiB long
    Large(Large),
    /// A Huge message
    ///
    /// The message is 16 MiB long
    Huge(Huge),
}

/// A message that can be sent between processes
pub struct ProcessMessage {
    /// The sender of the message
    pub to_pid: PID,
    /// The receiver of the message
    pub from_pid: PID,
    /// The message
    pub message: Message,
    /// The time the message was sent
    pub sender_time: Time,
    /// The time the message was received
    pub receiver_time: Time,
}

#[derive(Debug)]
/// An enum of all possible errors that can occur when sending a message
pub enum MessagingError {
    /// The message is too large to be sent
    MessageTooLarge,
    /// The reciever of the message is not valid
    ProcessNonExistant,
    /// The message Queue is full
    TooManyMessages,
}
