async_priority_limiter/limiter/
builder.rs1use 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}