use std::str::FromStr;
use super::source::parse_bool_like;
fn env_ok(key: &str) -> Option<String> {
std::env::var(key).ok()
}
fn csv_nonempty_parts(s: &str) -> Vec<String> {
s.split(',')
.map(|x| x.trim().to_string())
.filter(|x| !x.is_empty())
.collect()
}
pub(crate) fn apply_parse<T: FromStr>(dest: &mut Option<T>, key: &str) {
let Some(v) = env_ok(key) else {
return;
};
let Ok(n) = v.trim().parse::<T>() else {
return;
};
*dest = Some(n);
}
pub(crate) fn apply_bool(dest: &mut Option<bool>, key: &str) {
let Some(v) = env_ok(key) else {
return;
};
let Some(val) = parse_bool_like(&v) else {
return;
};
*dest = Some(val);
}
pub(crate) fn apply_nonempty_string(dest: &mut String, key: &str) {
let Some(v) = env_ok(key) else {
return;
};
let s = v.trim().to_string();
if s.is_empty() {
return;
}
*dest = s;
}
pub(crate) fn apply_nonempty_string_clearing_opt(
dest: &mut String,
file: &mut Option<String>,
key: &str,
) {
let Some(v) = env_ok(key) else {
return;
};
let s = v.trim().to_string();
if s.is_empty() {
return;
}
*dest = s;
*file = None;
}
pub(crate) fn apply_nonempty_opt(dest: &mut Option<String>, key: &str) {
let Some(v) = env_ok(key) else {
return;
};
let s = v.trim().to_string();
if s.is_empty() {
return;
}
*dest = Some(s);
}
pub(crate) fn apply_nonempty_opt_clearing_file(
dest: &mut Option<String>,
file: &mut Option<String>,
key: &str,
) {
let Some(v) = env_ok(key) else {
return;
};
let s = v.trim().to_string();
if s.is_empty() {
return;
}
*dest = Some(s);
*file = None;
}
pub(crate) fn apply_trimmed_opt(dest: &mut Option<String>, key: &str) {
let Some(v) = env_ok(key) else {
return;
};
*dest = Some(v.trim().to_string());
}
pub(crate) fn apply_raw_opt(dest: &mut Option<String>, key: &str) {
let Some(v) = env_ok(key) else {
return;
};
*dest = Some(v);
}
pub(crate) fn apply_csv_nonempty(dest: &mut Option<Vec<String>>, key: &str) {
let Some(v) = env_ok(key) else {
return;
};
let list = csv_nonempty_parts(&v);
if list.is_empty() {
return;
}
*dest = Some(list);
}
pub(crate) fn apply_csv_allow_empty(dest: &mut Option<Vec<String>>, key: &str) {
let Some(v) = env_ok(key) else {
return;
};
*dest = Some(csv_nonempty_parts(&v));
}
pub(crate) fn env_flag_true(key: &str) -> bool {
let Some(v) = env_ok(key) else {
return false;
};
parse_bool_like(&v) == Some(true)
}
#[cfg(test)]
mod tests {
use super::csv_nonempty_parts;
#[test]
fn csv_nonempty_parts_trims_and_drops_blanks() {
assert_eq!(
csv_nonempty_parts(" a, ,b,c "),
vec!["a".to_string(), "b".to_string(), "c".to_string()]
);
assert!(csv_nonempty_parts(" , , ").is_empty());
}
}