use std::sync::Arc;
use http::StatusCode;
use tako_rs_core::types::Request;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Algorithm {
TokenBucket,
Gcra,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum UnkeyedBehavior {
Allow,
Reject,
}
#[derive(Clone)]
pub struct Config {
pub max_requests: u32,
pub refill_rate: u32,
pub refill_interval_ms: u64,
pub status_on_limit: StatusCode,
pub algorithm: Algorithm,
pub on_unkeyed: UnkeyedBehavior,
}
impl Default for Config {
fn default() -> Self {
Self {
max_requests: 60,
refill_rate: 60,
refill_interval_ms: 1_000,
status_on_limit: StatusCode::TOO_MANY_REQUESTS,
algorithm: Algorithm::TokenBucket,
on_unkeyed: UnkeyedBehavior::Allow,
}
}
}
pub type KeyFn = Arc<dyn Fn(&Request) -> Option<String> + Send + Sync + 'static>;