use crate::{
util::accumulate_child_keys, ConfigurationBuilder, ConfigurationProvider, ConfigurationSource,
};
use std::collections::HashMap;
pub struct MemoryConfigurationProvider {
data: HashMap<String, (String, String)>,
}
impl MemoryConfigurationProvider {
pub fn new(data: HashMap<String, (String, String)>) -> Self {
Self { data }
}
}
impl ConfigurationProvider for MemoryConfigurationProvider {
fn get(&self, key: &str) -> Option<&str> {
self.data.get(&key.to_uppercase()).map(|t| t.1.as_str())
}
fn child_keys(&self, earlier_keys: &mut Vec<String>, parent_path: Option<&str>) {
accumulate_child_keys(&self.data, earlier_keys, parent_path)
}
}
#[derive(Default)]
pub struct MemoryConfigurationSource {
pub initial_data: Vec<(String, String)>,
}
impl MemoryConfigurationSource {
pub fn new(initial_data: Vec<(String, String)>) -> Self {
Self { initial_data }
}
}
impl ConfigurationSource for MemoryConfigurationSource {
fn build(&self, _builder: &dyn ConfigurationBuilder) -> Box<dyn ConfigurationProvider> {
let data: HashMap<_, _> = self
.initial_data
.iter()
.map(|t| (t.0.to_uppercase(), (t.0.clone(), t.1.clone())))
.collect();
Box::new(MemoryConfigurationProvider::new(data))
}
}
pub mod ext {
use super::*;
pub trait MemoryConfigurationBuilderExtensions {
fn add_in_memory(&mut self, data: Vec<(String, String)>) -> &mut Self;
}
impl MemoryConfigurationBuilderExtensions for dyn ConfigurationBuilder {
fn add_in_memory(&mut self, data: Vec<(String, String)>) -> &mut Self {
self.add(Box::new(MemoryConfigurationSource::new(data)));
self
}
}
impl<T: ConfigurationBuilder> MemoryConfigurationBuilderExtensions for T {
fn add_in_memory(&mut self, data: Vec<(String, String)>) -> &mut Self {
self.add(Box::new(MemoryConfigurationSource::new(data)));
self
}
}
}