Skip to main content

apollo_configuration/
overridable.rs

1use 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}