use std::time::Duration;
use redis::Client as RedisClient;
use crate::{Limiter, RateLimit};
#[derive(Default)]
pub struct RateLimitBuilder {
redis: Option<RedisClient>,
limiter: Option<Limiter>,
prefix: String,
timeout: Option<Duration>,
analytics: bool,
}
impl RateLimitBuilder {
pub fn redis(mut self, redis: RedisClient) -> RateLimitBuilder {
self.redis = Some(redis);
self
}
pub fn limiter(mut self, limiter: Limiter) -> RateLimitBuilder {
self.limiter = Some(limiter);
self
}
pub fn analytics(mut self, enabled: bool) -> RateLimitBuilder {
self.analytics = enabled;
self
}
pub fn timeout(mut self, timeout: std::time::Duration) -> RateLimitBuilder {
self.timeout = Some(timeout);
self
}
pub fn prefix(mut self, prefix: String) -> RateLimitBuilder {
self.prefix = prefix;
self
}
pub fn build(self) -> Result<RateLimit, &'static str> {
let prefix = match self.prefix.is_empty() {
true => self.prefix,
false => "@upstash/ratelimit".to_string(),
};
let redis = match self.redis {
Some(r) => r,
None => return Err("No redis client was defined."),
};
let limiter = match self.limiter {
Some(l) => l,
None => return Err("No limiter was defined."),
};
Ok(RateLimit {
redis,
limiter,
prefix,
timeout: self.timeout,
analytics: self.analytics,
})
}
}