strut_config/
assembler.rs1use crate::Scanner;
2use config::builder::{AsyncState, DefaultState};
3use config::{ConfigBuilder, Environment};
4
5pub struct Assembler;
7
8pub struct AssemblerChoices {
10 pub dir_name: Option<String>,
12 pub env_enabled: bool,
14 pub env_prefix: Option<String>,
17 pub env_separator: Option<String>,
20}
21
22impl Default for AssemblerChoices {
23 fn default() -> Self {
24 Self {
25 dir_name: Some("config".to_string()),
26 env_enabled: true,
27 env_prefix: Some("APP".to_string()),
28 env_separator: Some("_".to_string()),
29 }
30 }
31}
32
33macro_rules! bootstrap_builder {
34 ($builder:expr, $choices:expr) => {{
35 let mut builder = $builder;
36
37 for config_file in Scanner::find_config_files($choices.dir_name.as_deref()) {
39 builder = builder.add_source(config::File::from(config_file));
40 }
41
42 if $choices.env_enabled {
44 let mut env_source = Environment::default();
46
47 if let Some(prefix) = $choices.env_prefix.as_deref() {
49 env_source = env_source.prefix(prefix);
50 }
51
52 if let Some(separator) = $choices.env_separator.as_deref() {
54 env_source = env_source.separator(separator);
55 }
56
57 builder = builder.add_source(env_source);
59 }
60
61 builder
62 }};
63}
64
65impl Assembler {
66 pub fn make_sync_builder(choices: &AssemblerChoices) -> ConfigBuilder<DefaultState> {
71 bootstrap_builder!(ConfigBuilder::<DefaultState>::default(), choices)
72 }
73
74 pub fn make_async_builder(choices: &AssemblerChoices) -> ConfigBuilder<AsyncState> {
79 bootstrap_builder!(ConfigBuilder::<AsyncState>::default(), choices)
80 }
81}