use std::sync::Arc;
use crate::admin::AppState;
use crate::config::{
Action, ActionConfig, FlowControlConfig, GlobalConfig, LimiterConfig, Matcher, Rule,
};
use crate::governor::Governor;
use crate::storage::{BanStorage, MemoryBanStorage, MemoryStorage, Storage};
pub fn make_valid_config() -> FlowControlConfig {
FlowControlConfig {
version: "0.1.0".to_string(),
global: GlobalConfig::default(),
rules: vec![Rule {
id: "test_rule".to_string(),
name: "Test Rule".to_string(),
priority: 100,
matchers: vec![Matcher::User {
user_ids: vec!["*".to_string()],
}],
limiters: vec![LimiterConfig::TokenBucket {
capacity: 100,
refill_rate: 10,
}],
action: ActionConfig {
on_exceed: Action::Reject,
ban: None,
},
}],
}
}
pub async fn make_governor() -> Governor {
let storage: Arc<dyn Storage> = Arc::new(MemoryStorage::new());
let ban_storage: Arc<dyn BanStorage> = Arc::new(MemoryBanStorage::new());
Governor::builder()
.with_config(make_valid_config())
.with_storage(storage)
.with_ban_storage(ban_storage)
.build()
.await
.expect("Governor build should succeed with valid config")
}
pub async fn make_state() -> AppState {
let governor = Arc::new(make_governor().await);
AppState {
governor,
#[cfg(feature = "ban-manager")]
ban_manager: None,
#[cfg(feature = "quota-control")]
quota_controller: None,
#[cfg(feature = "circuit-breaker")]
circuit_breaker: None,
}
}
#[cfg(feature = "ban-manager")]
pub async fn make_state_with_ban_manager() -> AppState {
use crate::BanManager;
let governor = Arc::new(make_governor().await);
let ban_manager = Arc::new(
BanManager::new()
.await
.expect("BanManager::new should succeed"),
);
AppState {
governor,
ban_manager: Some(ban_manager),
#[cfg(feature = "quota-control")]
quota_controller: None,
#[cfg(feature = "circuit-breaker")]
circuit_breaker: None,
}
}