apollo-configuration 0.4.0

A typed, friendly configuration system for Apollo products.
Documentation
use crate::Configuration;
use crate::Validate;
use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;
use std::collections::HashMap;

#[derive(Debug, Clone, Default, JsonSchema, Serialize, Deserialize)]
#[schemars(rename = "Overridable{T}")]
pub struct Overridable<T> {
    pub global: T,
    pub overrides: HashMap<String, T>,
}

impl<T: Validate> Validate for Overridable<T> {
    fn validate(&self, mut errors: crate::validate::ErrorCollector<'_>) {
        self.global.validate(errors.nest("global"));
        let mut errors = errors.nest("overrides");
        for (key, value) in self.overrides.iter() {
            value.validate(errors.nest(key.as_str()));
        }
    }
}

impl<T: Configuration> Configuration for Overridable<T> {}

impl<T> Overridable<T> {
    pub fn resolve<'a>(&'a self, key: &str) -> &'a T {
        self.overrides.get(key).unwrap_or(&self.global)
    }
}