use std::num::NonZeroUsize;
use crate::ConfigError;
const DEFAULT_QUEUE_CAPACITY: NonZeroUsize = NonZeroUsize::new(1024).unwrap();
const DEFAULT_MAX_SLOT_QUEUE: usize = 100;
#[derive(Clone, Debug)]
#[must_use]
pub struct ControllerConfig {
queue_capacity: NonZeroUsize,
max_slot_queue: usize,
}
impl ControllerConfig {
pub const fn new(queue_capacity: NonZeroUsize, max_slot_queue: usize) -> Self {
Self {
queue_capacity,
max_slot_queue,
}
}
pub fn try_new(queue_capacity: usize, max_slot_queue: usize) -> Result<Self, ConfigError> {
let queue_capacity = NonZeroUsize::new(queue_capacity).ok_or(ConfigError::Zero {
field: "controller_queue_capacity",
})?;
Ok(Self::new(queue_capacity, max_slot_queue))
}
#[must_use]
pub const fn queue_capacity(&self) -> NonZeroUsize {
self.queue_capacity
}
#[must_use]
pub const fn max_slot_queue(&self) -> usize {
self.max_slot_queue
}
pub const fn with_queue_capacity(mut self, queue_capacity: NonZeroUsize) -> Self {
self.queue_capacity = queue_capacity;
self
}
pub fn try_with_queue_capacity(self, queue_capacity: usize) -> Result<Self, ConfigError> {
let queue_capacity = NonZeroUsize::new(queue_capacity).ok_or(ConfigError::Zero {
field: "controller_queue_capacity",
})?;
Ok(self.with_queue_capacity(queue_capacity))
}
pub const fn with_max_slot_queue(mut self, max_slot_queue: usize) -> Self {
self.max_slot_queue = max_slot_queue;
self
}
}
impl Default for ControllerConfig {
fn default() -> Self {
Self::new(DEFAULT_QUEUE_CAPACITY, DEFAULT_MAX_SLOT_QUEUE)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_contract_is_explicit() {
let config = ControllerConfig::default();
assert_eq!(config.queue_capacity().get(), 1024);
assert_eq!(config.max_slot_queue(), 100);
}
#[test]
fn constructor_and_builders_preserve_invariants() {
let config = ControllerConfig::new(NonZeroUsize::new(8).unwrap(), 3)
.with_queue_capacity(NonZeroUsize::new(16).unwrap())
.with_max_slot_queue(0);
assert_eq!(config.queue_capacity().get(), 16);
assert_eq!(config.max_slot_queue(), 0);
}
#[test]
fn raw_zero_capacity_returns_a_clear_error() {
for result in [
ControllerConfig::try_new(0, 10),
ControllerConfig::default().try_with_queue_capacity(0),
] {
assert_eq!(
result.unwrap_err(),
ConfigError::Zero {
field: "controller_queue_capacity"
}
);
}
}
}