#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PressureSignal {
Accept {
current_in_flight: usize,
max_in_flight: usize,
},
Defer {
current_in_flight: usize,
max_in_flight: usize,
current_buffer_depth: usize,
max_buffer_depth: usize,
},
Reject {
current_in_flight: usize,
max_in_flight: usize,
current_buffer_depth: usize,
max_buffer_depth: usize,
},
}
impl PressureSignal {
#[must_use]
pub const fn accept(current_in_flight: usize, max_in_flight: usize) -> Self {
Self::Accept {
current_in_flight,
max_in_flight,
}
}
#[must_use]
pub const fn defer(
current_in_flight: usize,
max_in_flight: usize,
current_buffer_depth: usize,
max_buffer_depth: usize,
) -> Self {
Self::Defer {
current_in_flight,
max_in_flight,
current_buffer_depth,
max_buffer_depth,
}
}
#[must_use]
pub const fn reject(
current_in_flight: usize,
max_in_flight: usize,
current_buffer_depth: usize,
max_buffer_depth: usize,
) -> Self {
Self::Reject {
current_in_flight,
max_in_flight,
current_buffer_depth,
max_buffer_depth,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct DeliveryResult {
pub signal: PressureSignal,
}
impl DeliveryResult {
#[must_use]
pub const fn new(signal: PressureSignal) -> Self {
Self { signal }
}
#[must_use]
pub const fn accepted(current_in_flight: usize, max_in_flight: usize) -> Self {
Self::new(PressureSignal::accept(current_in_flight, max_in_flight))
}
#[must_use]
pub const fn deferred(
current_in_flight: usize,
max_in_flight: usize,
current_buffer_depth: usize,
max_buffer_depth: usize,
) -> Self {
Self::new(PressureSignal::defer(
current_in_flight,
max_in_flight,
current_buffer_depth,
max_buffer_depth,
))
}
#[must_use]
pub const fn rejected(
current_in_flight: usize,
max_in_flight: usize,
current_buffer_depth: usize,
max_buffer_depth: usize,
) -> Self {
Self::new(PressureSignal::reject(
current_in_flight,
max_in_flight,
current_buffer_depth,
max_buffer_depth,
))
}
}
#[cfg(test)]
mod tests {
use super::{DeliveryResult, PressureSignal};
#[test]
fn pressure_signal_defines_only_accept_defer_reject_semantics() {
let accept = PressureSignal::accept(0, 10);
let defer = PressureSignal::defer(10, 10, 3, 50);
let reject = PressureSignal::reject(10, 10, 50, 50);
assert_eq!(
accept,
PressureSignal::Accept {
current_in_flight: 0,
max_in_flight: 10,
}
);
assert_eq!(
defer,
PressureSignal::Defer {
current_in_flight: 10,
max_in_flight: 10,
current_buffer_depth: 3,
max_buffer_depth: 50,
}
);
assert_eq!(
reject,
PressureSignal::Reject {
current_in_flight: 10,
max_in_flight: 10,
current_buffer_depth: 50,
max_buffer_depth: 50,
}
);
}
#[test]
fn delivery_result_carries_signal_in_return_value() {
let accepted = DeliveryResult::accepted(1, 10);
let deferred = DeliveryResult::deferred(10, 10, 2, 50);
let rejected = DeliveryResult::rejected(10, 10, 50, 50);
assert_eq!(accepted.signal, PressureSignal::accept(1, 10));
assert_eq!(deferred.signal, PressureSignal::defer(10, 10, 2, 50));
assert_eq!(rejected.signal, PressureSignal::reject(10, 10, 50, 50));
}
#[test]
fn pressure_root_re_exports_signal_result_types() {
use crate::pressure::{
DeliveryResult as RootDeliveryResult, PressureSignal as RootPressureSignal,
};
let result = RootDeliveryResult::new(RootPressureSignal::accept(0, 1));
assert_eq!(result.signal, RootPressureSignal::accept(0, 1));
}
}