use crate::Quota;
use crate::refill_rate::RefillRate;
#[derive(Clone, Copy, Debug, Default)]
pub struct QuotaPolicy {
capacity: f64,
refill_rate_ns: f64,
refill_interval_ns: u64,
}
impl QuotaPolicy {
#[inline]
pub fn new() -> QuotaPolicy {
QuotaPolicy {
capacity: 0.0,
refill_rate_ns: 0.0,
refill_interval_ns: 0,
}
}
#[inline]
pub fn set_capacity(self, capacity: f64) -> Self {
Self { capacity, ..self }
}
#[inline]
pub fn set_refill_rate(self, refill_rate: RefillRate) -> Self {
Self {
refill_rate_ns: refill_rate.0,
..self
}
}
#[inline]
pub fn set_refill_interval(self, interval: std::time::Duration) -> Self {
Self {
refill_interval_ns: interval.as_nanos() as u64,
..self
}
}
#[inline]
pub fn tick(&self, dt_ns: u64, quota: &Quota) {
let refill_amount = self.refill_rate_ns * dt_ns as f64;
quota.fill(refill_amount, self.capacity);
}
#[inline]
pub fn tick_with_interval(
&self,
dt_ns: u64,
quota: &Quota,
elapsed_since_refill_ns: u64,
) -> bool {
if elapsed_since_refill_ns < self.refill_interval_ns {
return false;
}
let refill_amount = self.refill_rate_ns * dt_ns as f64;
quota.fill(refill_amount, self.capacity);
true
}
}
#[cfg(test)]
mod tests;