#[cfg(feature = "orm")]
use super::db::DbFeatureDriver;
use super::driver::FeatureDriver;
use super::env::EnvFeatureDriver;
use super::memory::MemoryFeatureDriver;
use super::toml::TomlFeatureDriver;
#[non_exhaustive]
pub struct FeatureManager {
drivers: Vec<Box<dyn FeatureDriver>>,
}
impl FeatureManager {
pub fn new() -> Self {
Self {
drivers: Vec::new(),
}
}
pub fn add_driver(mut self, driver: Box<dyn FeatureDriver>) -> Self {
self.drivers.push(driver);
self
}
pub async fn enabled(&self, flag: &str) -> bool {
for driver in &self.drivers {
if let Some(val) = driver.enabled(flag).await {
return val;
}
}
false
}
pub async fn enabled_for(&self, flag: &str, identifier: &str) -> bool {
for driver in &self.drivers {
if let Some(val) = driver.enabled_for(flag, identifier).await {
return val;
}
}
false
}
pub async fn variant(&self, flag: &str, identifier: &str) -> Option<String> {
for driver in &self.drivers {
if let Some(val) = driver.variant(flag, identifier).await {
return Some(val);
}
}
None
}
}
impl Default for FeatureManager {
fn default() -> Self {
let manager = Self::new()
.add_driver(Box::new(MemoryFeatureDriver::new()))
.add_driver(Box::new(EnvFeatureDriver::new()))
.add_driver(Box::new(TomlFeatureDriver::new()));
#[cfg(feature = "orm")]
let manager = manager.add_driver(Box::new(DbFeatureDriver::new()));
manager
}
}