#[doc(hidden)]
pub fn read(name: &'static str, cell: &'static std::sync::OnceLock<Option<String>>) -> Option<std::borrow::Cow<'static, str>> {
if read_once_enabled() {
cell.get_or_init(|| std::env::var(name).ok()).as_deref().map(std::borrow::Cow::Borrowed)
} else {
std::env::var(name).ok().map(std::borrow::Cow::Owned)
}
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Grammar {
Switch,
Flag,
}
fn reading(name: &str, grammar: Grammar) -> Option<bool> {
let value = std::env::var_os(name);
let value = value.as_ref().map(|value| value.to_str());
match grammar {
Grammar::Switch => match value {
Some(Some("0" | "off" | "false")) => Some(false),
Some(Some("1" | "on" | "true")) => Some(true),
_ => None,
},
Grammar::Flag => Some(!matches!(value, None | Some(Some("0" | "off" | "false")))),
}
}
#[doc(hidden)]
pub fn switch(name: &'static str, cell: &'static std::sync::OnceLock<Option<bool>>, default: bool, grammar: Grammar) -> bool {
let read = if read_once_enabled() { *cell.get_or_init(|| reading(name, grammar)) } else { reading(name, grammar) };
overridden(name, read.unwrap_or(default))
}
#[doc(hidden)]
pub fn switch_live(name: &'static str, default: bool, grammar: Grammar) -> bool {
overridden(name, reading(name, grammar).unwrap_or(default))
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Mode {
Off,
Check,
On,
}
fn mode_reading(name: &str) -> Option<Mode> {
match std::env::var(name).as_deref() {
Ok("0") | Ok("off") => Some(Mode::Off),
Ok("check") => Some(Mode::Check),
Ok(_) => Some(Mode::On),
Err(_) => None,
}
}
#[doc(hidden)]
pub fn mode(name: &'static str, cell: &'static std::sync::OnceLock<Option<Mode>>, default_on: bool) -> Mode {
let read = if read_once_enabled() { *cell.get_or_init(|| mode_reading(name)) } else { mode_reading(name) };
read.unwrap_or(if default_on { Mode::On } else { Mode::Off })
}
#[doc(hidden)]
pub fn mode_live(name: &'static str, default_on: bool) -> Mode {
mode_reading(name).unwrap_or(if default_on { Mode::On } else { Mode::Off })
}
#[inline]
fn overridden(name: &'static str, value: bool) -> bool {
let _ = name;
value
}
#[doc(hidden)]
pub fn read_once_enabled() -> bool {
static ON: std::sync::OnceLock<bool> = std::sync::OnceLock::new();
let enabled = *ON.get_or_init(|| !matches!(std::env::var("BREP_ENV_READ_ONCE").as_deref(), Ok("0") | Ok("off")));
enabled
}