use crate::domain::{ConfigKey, ConfigValue, Result};
use crate::ports::ConfigWatcher;
pub trait ConfigurationService {
fn get(&self, key: &ConfigKey) -> Result<ConfigValue>;
fn get_str(&self, key: &str) -> Result<ConfigValue> {
self.get(&ConfigKey::from(key))
}
fn get_or_default(&self, key: &ConfigKey, default: &str) -> ConfigValue;
fn get_or_default_str(&self, key: &str, default: &str) -> ConfigValue {
self.get_or_default(&ConfigKey::from(key), default)
}
fn has(&self, key: &ConfigKey) -> bool;
fn has_str(&self, key: &str) -> bool {
self.has(&ConfigKey::from(key))
}
fn reload(&mut self) -> Result<()>;
fn register_watcher(&mut self, watcher: Box<dyn ConfigWatcher>) -> Result<()>;
}
#[cfg(test)]
mod tests {
use super::*;
struct TestConfigService;
impl ConfigurationService for TestConfigService {
fn get(&self, _key: &ConfigKey) -> Result<ConfigValue> {
Ok(ConfigValue::from("test_value"))
}
fn get_or_default(&self, key: &ConfigKey, default: &str) -> ConfigValue {
self.get(key).unwrap_or_else(|_| ConfigValue::from(default))
}
fn has(&self, _key: &ConfigKey) -> bool {
true
}
fn reload(&mut self) -> Result<()> {
Ok(())
}
fn register_watcher(&mut self, _watcher: Box<dyn ConfigWatcher>) -> Result<()> {
Ok(())
}
}
#[test]
fn test_service_get() {
let service = TestConfigService;
let key = ConfigKey::from("test.key");
let value = service.get(&key).unwrap();
assert_eq!(value.as_str(), "test_value");
}
#[test]
fn test_service_get_or_default() {
let service = TestConfigService;
let key = ConfigKey::from("test.key");
let value = service.get_or_default(&key, "default");
assert_eq!(value.as_str(), "test_value");
}
#[test]
fn test_service_has() {
let service = TestConfigService;
let key = ConfigKey::from("test.key");
assert!(service.has(&key));
}
#[test]
fn test_service_reload() {
let mut service = TestConfigService;
assert!(service.reload().is_ok());
}
#[test]
fn test_service_register_watcher() {
use std::sync::Arc;
struct DummyWatcher;
impl ConfigWatcher for DummyWatcher {
fn watch(&mut self, _callback: Arc<dyn Fn(ConfigKey) + Send + Sync>) -> Result<()> {
Ok(())
}
fn stop(&mut self) -> Result<()> {
Ok(())
}
}
let mut service = TestConfigService;
let watcher = Box::new(DummyWatcher);
assert!(service.register_watcher(watcher).is_ok());
}
}