#[repr(u8)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum OverflowPolicy {
#[default]
Reject = 0,
DropNewest = 1,
DropOldest = 2,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct MailboxConfig {
capacity: super::MailboxCapacity,
bytes: super::MailboxBytes,
overflow: OverflowPolicy,
}
impl MailboxConfig {
pub const DEFAULT: MailboxConfig = MailboxConfig {
capacity: super::MailboxCapacity::DEFAULT,
bytes: super::MailboxBytes::DEFAULT,
overflow: OverflowPolicy::Reject,
};
pub const fn new(capacity: super::MailboxCapacity, overflow: OverflowPolicy) -> Self {
Self {
capacity,
bytes: super::MailboxBytes::DEFAULT,
overflow,
}
}
pub const fn with_bytes(self, bytes: super::MailboxBytes) -> Self {
Self { bytes, ..self }
}
#[inline]
pub const fn capacity(&self) -> super::MailboxCapacity {
self.capacity
}
#[inline]
pub const fn bytes(&self) -> super::MailboxBytes {
self.bytes
}
#[inline]
pub const fn overflow(&self) -> OverflowPolicy {
self.overflow
}
}
impl Default for MailboxConfig {
fn default() -> Self {
Self::DEFAULT
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::scheduler::mailbox::{MailboxBytes, MailboxCapacity};
#[test]
fn default_is_reject_256() {
let c = MailboxConfig::DEFAULT;
assert_eq!(c.capacity().get(), 256);
assert_eq!(c.bytes().get(), MailboxBytes::DEFAULT.get());
assert_eq!(c.overflow(), OverflowPolicy::Reject);
}
#[test]
fn new_preserves_parts() -> Result<(), &'static str> {
let cap = MailboxCapacity::new(4).ok_or("cap")?;
let c = MailboxConfig::new(cap, OverflowPolicy::DropOldest);
assert_eq!(c.capacity().get(), 4);
assert_eq!(c.overflow(), OverflowPolicy::DropOldest);
assert_eq!(c.bytes().get(), MailboxBytes::DEFAULT.get());
Ok(())
}
#[test]
fn with_bytes_narrows_only_the_budget() -> Result<(), &'static str> {
let cap = MailboxCapacity::new(4).ok_or("cap")?;
let budget = MailboxBytes::new(8192).ok_or("bytes")?;
let c = MailboxConfig::new(cap, OverflowPolicy::DropOldest).with_bytes(budget);
assert_eq!(c.bytes().get(), 8192);
assert_eq!(c.capacity().get(), 4);
assert_eq!(c.overflow(), OverflowPolicy::DropOldest);
Ok(())
}
}