winbrew_database\config/
keys.rs

1use std::env;
2
3#[cfg(test)]
4const PREFIXED_SECTIONS: &[&str] = &["core", "paths"];
5
6pub(crate) fn env_override(key: &str) -> Option<String> {
7    env_override_from(key, |name| env::var(name).ok())
8}
9
10fn env_override_from<F>(key: &str, lookup: F) -> Option<String>
11where
12    F: FnOnce(&str) -> Option<String>,
13{
14    lookup(&env_override_name(key)).filter(|value| !value.trim().is_empty())
15}
16
17/// Returns a section-qualified key for the known prefixed config sections.
18///
19/// `PREFIXED_SECTIONS` is the single source of truth for section names that
20/// should keep their section prefix in the flattened key.
21#[cfg(test)]
22fn section_key(section_title: &str, key: &str) -> String {
23    let section = section_title.to_lowercase();
24
25    if PREFIXED_SECTIONS.contains(&section.as_str()) {
26        format!("{section}.{key}")
27    } else {
28        key.to_string()
29    }
30}
31
32fn env_override_name(key: &str) -> String {
33    format!("WINBREW_{}", key.replace('.', "_").to_uppercase())
34}
35
36#[cfg(test)]
37mod tests {
38    use super::{env_override_from, env_override_name, section_key};
39
40    #[test]
41    fn section_key_uses_section_prefix_for_known_sections() {
42        assert_eq!(section_key("Core", "log_level"), "core.log_level");
43        assert_eq!(section_key("Paths", "root"), "paths.root");
44    }
45
46    #[test]
47    fn section_key_leaves_unknown_sections_unmodified() {
48        assert_eq!(section_key("Custom", "value"), "value");
49    }
50
51    #[test]
52    fn section_key_covers_all_prefixed_sections() {
53        for &section in super::PREFIXED_SECTIONS {
54            let result = section_key(section, "key");
55            assert_eq!(
56                result,
57                format!("{section}.key"),
58                "section '{section}' should be prefixed"
59            );
60        }
61    }
62
63    #[test]
64    fn env_override_name_returns_canonical_name() {
65        assert_eq!(
66            env_override_name("paths.packages"),
67            "WINBREW_PATHS_PACKAGES"
68        );
69    }
70
71    #[test]
72    fn env_override_ignores_blank_values() {
73        assert_eq!(
74            env_override_from("test.key", |_| Some("   ".to_string())),
75            None
76        );
77    }
78
79    #[test]
80    fn env_override_returns_non_blank_values() {
81        assert_eq!(
82            env_override_from("test.key", |_| Some("  value  ".to_string())),
83            Some("  value  ".to_string())
84        );
85    }
86
87    #[test]
88    fn env_override_returns_none_when_missing() {
89        assert_eq!(env_override_from("test.key", |_| None), None);
90    }
91}