use std::time::Duration;
use tokio::sync::mpsc;
use super::{
DEFAULT_PUSH_RATE,
FrameLike,
PushConfigError,
PushHandle,
PushQueueConfig,
PushQueues,
};
#[derive(Debug)]
pub struct PushQueuesBuilder<F> {
high_capacity: usize,
low_capacity: usize,
rate: Option<usize>,
dlq: Option<mpsc::Sender<F>>,
dlq_log_every_n: usize,
dlq_log_interval: Duration,
}
impl<F: FrameLike> Default for PushQueuesBuilder<F> {
fn default() -> Self {
Self {
high_capacity: 1,
low_capacity: 1,
rate: Some(DEFAULT_PUSH_RATE),
dlq: None,
dlq_log_every_n: 1,
dlq_log_interval: Duration::from_secs(10),
}
}
}
impl<F: FrameLike> PushQueuesBuilder<F> {
#[must_use]
pub fn high_capacity(mut self, capacity: usize) -> Self {
self.high_capacity = capacity;
self
}
#[must_use]
pub fn low_capacity(mut self, capacity: usize) -> Self {
self.low_capacity = capacity;
self
}
#[must_use]
pub fn rate(mut self, rate: Option<usize>) -> Self {
self.rate = rate;
self
}
#[must_use]
pub fn unlimited(self) -> Self { self.rate(None) }
#[must_use]
pub fn dlq(mut self, dlq: Option<mpsc::Sender<F>>) -> Self {
self.dlq = dlq;
self
}
#[must_use]
pub fn dlq_log_every_n(mut self, n: usize) -> Self {
self.dlq_log_every_n = n;
self
}
#[must_use]
pub fn dlq_log_interval(mut self, interval: Duration) -> Self {
self.dlq_log_interval = interval;
self
}
pub fn build(self) -> Result<(PushQueues<F>, PushHandle<F>), PushConfigError> {
PushQueues::build_with_config(PushQueueConfig {
high_capacity: self.high_capacity,
low_capacity: self.low_capacity,
rate: self.rate,
dlq: self.dlq,
dlq_log_every_n: self.dlq_log_every_n,
dlq_log_interval: self.dlq_log_interval,
})
}
}