use crate::{
util::accumulate_child_keys, ConfigurationBuilder, ConfigurationProvider, ConfigurationSource, Value,
};
use std::collections::HashMap;
pub struct MemoryConfigurationProvider {
data: HashMap<String, (String, Value)>,
}
impl MemoryConfigurationProvider {
pub fn new(data: HashMap<String, (String, Value)>) -> Self {
Self { data }
}
}
impl ConfigurationProvider for MemoryConfigurationProvider {
fn get(&self, key: &str) -> Option<Value> {
self.data
.get(&key.to_uppercase())
.map(|t| t.1.clone())
}
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, Value)>,
}
impl MemoryConfigurationSource {
pub fn new<S: AsRef<str>>(initial_data: &[(S, S)]) -> Self {
Self {
initial_data: initial_data
.iter()
.map(|t| (t.0.as_ref().to_owned(), t.1.as_ref().to_owned().into()))
.collect(),
}
}
}
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<S: AsRef<str>>(&mut self, data: &[(S, S)]) -> &mut Self;
}
impl MemoryConfigurationBuilderExtensions for dyn ConfigurationBuilder + '_ {
fn add_in_memory<S: AsRef<str>>(&mut self, data: &[(S, S)]) -> &mut Self {
self.add(Box::new(MemoryConfigurationSource::new(data)));
self
}
}
impl<T: ConfigurationBuilder> MemoryConfigurationBuilderExtensions for T {
fn add_in_memory<S: AsRef<str>>(&mut self, data: &[(S, S)]) -> &mut Self {
self.add(Box::new(MemoryConfigurationSource::new(data)));
self
}
}
}