winbrew_database\config/
keys.rs1use 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#[cfg(test)]
22fn section_key(section_title: &str, key: &str) -> String {
23 let section = section_title.to_lowercase();
24
25 if PREFIXED_SECTIONS.contains(§ion.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 §ion 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}