support_kit/config/
config_manifest.rs

1use figment::{Figment, Provider};
2use std::fmt::Debug;
3
4use super::ConfigDefinition;
5
6#[derive(Default, Debug, bon::Builder, PartialEq)]
7pub struct ConfigManifest {
8    definitions: Vec<ConfigDefinition>,
9}
10
11impl ConfigManifest {
12    pub fn merge(&mut self, source: ConfigManifest) {
13        self.definitions.extend(source.definitions);
14    }
15
16    pub fn missing(&self) -> Self {
17        let definitions = self
18            .definitions
19            .iter()
20            .filter(|definition| matches!(definition, ConfigDefinition::NotFound(_)))
21            .cloned()
22            .collect();
23
24        Self::builder().definitions(definitions).build()
25    }
26
27    pub fn known(&self) -> Self {
28        let definitions = self
29            .definitions
30            .iter()
31            .filter(|definition| !matches!(definition, ConfigDefinition::NotFound(_)))
32            .cloned()
33            .collect();
34
35        Self::builder().definitions(definitions).build()
36    }
37}
38
39impl Provider for ConfigManifest {
40    fn metadata(&self) -> figment::Metadata {
41        Default::default()
42    }
43
44    fn data(
45        &self,
46    ) -> Result<figment::value::Map<figment::Profile, figment::value::Dict>, figment::Error> {
47        let mut figment = Figment::new();
48        for source in &self.definitions {
49            figment = figment.merge(source);
50        }
51
52        Ok(figment.data()?)
53    }
54}