use std::ffi::OsString;
pub(super) fn validate_env_key(key: &OsString) {
assert!(
!key.is_empty(),
"ScopedEnv received an empty environment variable name"
);
assert!(
!contains_nul(key),
"ScopedEnv received an environment variable name containing NUL"
);
assert!(
!contains_equals(key),
"ScopedEnv received an environment variable name containing '='"
);
}
pub(super) fn validate_env_value(value: Option<&OsString>) {
if let Some(env_value) = value {
assert!(
!contains_nul(env_value),
"ScopedEnv received an environment variable value containing NUL"
);
}
}
pub(super) fn is_valid_env_key(key: &OsString) -> bool {
!key.is_empty() && !contains_nul(key) && !contains_equals(key)
}
pub(super) fn is_valid_env_value(value: Option<&OsString>) -> bool {
value.is_none_or(|env_value| !contains_nul(env_value))
}
#[cfg(unix)]
fn contains_equals(key: &OsString) -> bool {
use std::os::unix::ffi::OsStrExt;
key.as_os_str().as_bytes().contains(&b'=')
}
#[cfg(windows)]
fn contains_equals(key: &OsString) -> bool {
use std::os::windows::ffi::OsStrExt;
key.as_os_str()
.encode_wide()
.any(|value| value == u16::from(b'='))
}
#[cfg(not(any(unix, windows)))]
fn contains_equals(key: &OsString) -> bool { key.to_string_lossy().contains('=') }
#[cfg(unix)]
fn contains_nul(value: &OsString) -> bool {
use std::os::unix::ffi::OsStrExt;
value.as_os_str().as_bytes().contains(&b'\0')
}
#[cfg(windows)]
fn contains_nul(value: &OsString) -> bool {
use std::os::windows::ffi::OsStrExt;
value.as_os_str().encode_wide().any(|unit| unit == 0)
}
#[cfg(not(any(unix, windows)))]
fn contains_nul(value: &OsString) -> bool { value.to_string_lossy().contains('\0') }