use std::{
collections::BTreeMap,
ffi::{OsStr, OsString},
};
pub fn var(name: &str) -> Option<OsString> {
std::env::var_os(name)
}
pub fn var_text(name: &str) -> Option<String> {
std::env::var(name).ok()
}
pub(crate) fn snapshot() -> BTreeMap<OsString, OsString> {
artifactize_tools::environment::user()
}
const OWN_PREFIX: &str = "ARTIFACTIZE_";
pub(crate) fn for_command() -> BTreeMap<OsString, OsString> {
let mut environment = snapshot();
environment.retain(|name, _| {
!name
.to_str()
.is_some_and(|name| name.to_ascii_uppercase().starts_with(OWN_PREFIX))
});
environment
}
pub(crate) fn set(
environment: &mut BTreeMap<OsString, OsString>,
name: &str,
value: impl Into<OsString>,
) {
if super::ENV_NAMES_IGNORE_CASE {
environment.retain(|key, _| {
!key.to_str()
.is_some_and(|key| key.eq_ignore_ascii_case(name))
});
}
environment.insert(name.into(), value.into());
}
pub(crate) fn lookup<'a>(
environment: &'a BTreeMap<OsString, OsString>,
name: &str,
) -> Option<&'a OsStr> {
if super::ENV_NAMES_IGNORE_CASE {
environment.iter().find_map(|(key, value)| {
key.to_str()
.is_some_and(|key| key.eq_ignore_ascii_case(name))
.then_some(value.as_os_str())
})
} else {
environment.get(OsStr::new(name)).map(OsString::as_os_str)
}
}