async_priority_limiter/limiter/
builder.rs1use super::Limiter;
2use crate::{
3 blocks::Blocks,
4 intervals::Intervals,
5 traits::{Key, Priority, TaskResult},
6};
7
8use std::time::Duration;
9use tokio::time::Instant;
10
11#[derive(Debug)]
12pub struct LimiterBuilder<K: Key> {
13 pub(crate) concurrent_tasks: usize,
14 pub(crate) blocks: Blocks<K>,
15 pub(crate) intervals: Intervals<K>,
16}
17
18impl LimiterBuilder<String> {
19 pub fn new<K: Key>(concurrent_tasks: usize) -> LimiterBuilder<K> {
20 LimiterBuilder {
21 concurrent_tasks,
22 blocks: Default::default(),
23 intervals: Default::default(),
24 }
25 }
26}
27
28impl<K: Key> LimiterBuilder<K> {
29 pub fn with_concurrent_tasks(mut self, concurrent_tasks: usize) -> Self {
30 self.concurrent_tasks = concurrent_tasks;
31 self
32 }
33 pub fn with_default_block_until(mut self, instant: Option<Instant>) -> Self {
34 self.blocks.set_default(instant);
35 self
36 }
37 pub fn with_default_block_until_at_least(mut self, instant: Instant) -> Self {
38 self.blocks.set_default_at_least(instant);
39 self
40 }
41 pub fn with_block_by_key_until(mut self, instant: Option<Instant>, key: K) -> Self {
42 self.blocks.set_by_key(instant, key);
43 self
44 }
45 pub fn with_block_by_key_until_at_least(mut self, instant: Instant, key: K) -> Self {
46 self.blocks.set_at_least_by_key(instant, key);
47 self
48 }
49
50 pub fn with_default_interval(mut self, period: Option<Duration>) -> Self {
51 self.intervals.set_default(period);
52 self
53 }
54 pub fn with_default_interval_at_least(mut self, period: Duration) -> Self {
55 self.intervals.set_default_at_least(period);
56 self
57 }
58 pub fn with_interval_by_key(mut self, period: Option<Duration>, key: K) -> Self {
59 self.intervals.set_by_key(period, key);
60 self
61 }
62 pub fn with_interval_by_key_at_least(mut self, period: Duration, key: K) -> Self {
63 self.intervals.set_at_least_by_key(period, key);
64 self
65 }
66
67 pub fn build<P: Priority, T: TaskResult>(self) -> Limiter<K, P, T> {
68 Limiter::new_with::<K>(self.concurrent_tasks, self.blocks, self.intervals)
69 }
70}