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)
}
}