use std::{marker::PhantomData, time::Duration};
use apalis_codec::json::JsonCodec;
use apalis_core::backend::{
poll_strategy::{BackoffConfig, IntervalStrategy, MultiStrategy, StrategyBuilder},
queue::Queue,
};
#[derive(Debug)]
pub struct Config<Codec = JsonCodec<Vec<u8>>> {
poll_strategy: MultiStrategy,
buffer_size: usize,
queue: Queue,
visibility_timeout: Duration,
_codec: PhantomData<Codec>,
}
impl<C> Clone for Config<C> {
fn clone(&self) -> Self {
Self {
poll_strategy: self.poll_strategy.clone(),
buffer_size: self.buffer_size,
queue: self.queue.clone(),
visibility_timeout: self.visibility_timeout,
_codec: self._codec,
}
}
}
impl<Codec> Config<Codec> {
pub fn queue(&self) -> &Queue {
&self.queue
}
pub fn with_queue<S: AsRef<str>>(mut self, queue: S) -> Self {
self.queue = Queue::from(queue.as_ref());
self
}
pub fn poll_strategy(&self) -> &MultiStrategy {
&self.poll_strategy
}
pub fn with_poll_strategy(mut self, strategy: MultiStrategy) -> Self {
self.poll_strategy = strategy;
self
}
pub fn buffer_size(&self) -> usize {
self.buffer_size
}
pub fn with_buffer_size(mut self, size: usize) -> Self {
self.buffer_size = size;
self
}
pub fn visibility_timeout(&self) -> Duration {
self.visibility_timeout
}
pub fn with_visibility_timeout(mut self, timeout: Duration) -> Self {
self.visibility_timeout = timeout;
self
}
pub fn with_codec<C>(self) -> Config<C> {
Config {
poll_strategy: self.poll_strategy,
buffer_size: self.buffer_size,
queue: self.queue,
visibility_timeout: self.visibility_timeout,
_codec: PhantomData,
}
}
}
impl Default for Config<JsonCodec<Vec<u8>>> {
fn default() -> Self {
let config = BackoffConfig::default().with_jitter(0.9);
let interval = IntervalStrategy::new(Duration::from_millis(50)).with_backoff(config);
let poll_strategy = StrategyBuilder::new().apply(interval).build();
Self {
poll_strategy,
buffer_size: 100,
queue: "default_queue".into(),
visibility_timeout: Duration::from_secs(30),
_codec: PhantomData,
}
}
}