apollo_configuration/
overridable.rs1use crate::Configuration;
2use crate::Validate;
3use schemars::JsonSchema;
4use serde::Deserialize;
5use serde::Serialize;
6use std::collections::HashMap;
7
8#[derive(Debug, Clone, Default, JsonSchema, Serialize, Deserialize)]
9#[schemars(rename = "Overridable{T}")]
10pub struct Overridable<T> {
11 pub global: T,
12 pub overrides: HashMap<String, T>,
13}
14
15impl<T: Validate> Validate for Overridable<T> {
16 fn validate(&self, mut errors: crate::validate::ErrorCollector<'_>) {
17 self.global.validate(errors.nest("global"));
18 let mut errors = errors.nest("overrides");
19 for (key, value) in self.overrides.iter() {
20 value.validate(errors.nest(key.as_str()));
21 }
22 }
23}
24
25impl<T: Configuration> Configuration for Overridable<T> {}
26
27impl<T> Overridable<T> {
28 pub fn resolve<'a>(&'a self, key: &str) -> &'a T {
29 self.overrides.get(key).unwrap_or(&self.global)
30 }
31}