support_kit/config/
config_manifest.rs1use 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}