use std::collections::BTreeMap;
use serde_json::Value;
use super::{ConfigProvider, ProviderKind};
use crate::config::map::ConfigMap;
use crate::error::ConfigError;
#[derive(Debug, Default, Clone)]
pub struct MemoryProvider {
values: BTreeMap<String, Value>,
}
impl MemoryProvider {
pub fn new() -> Self {
Self::default()
}
pub fn from_map(values: BTreeMap<String, Value>) -> Self {
Self { values }
}
#[must_use]
pub fn set(mut self, key: impl Into<String>, value: impl Into<Value>) -> Self {
self.values.insert(key.into(), value.into());
self
}
}
#[async_trait::async_trait]
impl ConfigProvider for MemoryProvider {
fn name(&self) -> String {
"memory".to_owned()
}
fn kind(&self) -> ProviderKind {
ProviderKind::Memory
}
async fn load(&self) -> Result<ConfigMap, ConfigError> {
Ok(ConfigMap::from(self.values.clone()))
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[tokio::test]
async fn loads_seeded_values() {
let provider = MemoryProvider::new()
.set("app_name", "svc")
.set("database", json!({ "url": "postgres://localhost" }));
let out = provider.load().await.unwrap();
assert_eq!(out.get("app_name"), Some(&json!("svc")));
assert_eq!(out.get("database"), Some(&json!({ "url": "postgres://localhost" })));
}
}