async_priority_limiter/limiter/
builder.rs

1use super::Limiter;
2use crate::{
3    blocks::Blocks,
4    intervals::Intervals,
5    traits::{Key, Priority, TaskResult},
6};
7
8use tokio::time::Instant;
9
10#[derive(Debug)]
11pub struct LimiterBuilder<K: Key> {
12    pub(crate) concurrent_tasks: usize,
13    pub(crate) blocks: Blocks<K>,
14    pub(crate) intervals: Intervals<K>,
15}
16
17impl LimiterBuilder<String> {
18    pub fn new<K: Key>(concurrent_tasks: usize) -> LimiterBuilder<K> {
19        LimiterBuilder {
20            concurrent_tasks,
21            blocks: Default::default(),
22            intervals: Default::default(),
23        }
24    }
25}
26
27impl<K: Key> LimiterBuilder<K> {
28    pub fn with_concurrent_tasks(mut self, concurrent_tasks: usize) -> Self {
29        self.concurrent_tasks = concurrent_tasks;
30        self
31    }
32    pub fn with_block_until(mut self, instant: Option<Instant>) -> Self {
33        self.blocks.set_default(instant);
34        self
35    }
36    pub fn with_block_until_at_least(mut self, instant: Instant) -> Self {
37        self.blocks.set_default_at_least(instant);
38        self
39    }
40    pub fn with_block_by_key_until(mut self, instant: Option<Instant>, key: K) -> Self {
41        self.blocks.set_by_key(instant, key);
42        self
43    }
44    pub fn with_block_by_key_until_at_least(mut self, instant: Instant, key: K) -> Self {
45        self.blocks.set_at_least_by_key(instant, key);
46        self
47    }
48
49    pub fn build<P: Priority, T: TaskResult>(self) -> Limiter<K, P, T> {
50        Limiter::new_with::<K>(self.concurrent_tasks, self.blocks, self.intervals)
51    }
52}