use std::str::FromStr;
macro_rules! env_keys {
($( $(#[$meta:meta])* $name:ident = $value:literal; )+ $(,)?) => {
$(
$(#[$meta])*
pub const $name: &str = $value;
)+
};
}
pub mod read {
use super::FromStr;
pub fn required(key: &str) -> String {
std::env::var(key).unwrap_or_else(|_| panic!("missing env var: {key}"))
}
pub fn optional(key: &str) -> Option<String> {
std::env::var(key).ok()
}
pub fn string_or(key: &str, default: &str) -> String {
std::env::var(key).unwrap_or_else(|_| default.to_string())
}
pub fn parse<T>(key: &str) -> Option<T>
where
T: FromStr,
{
std::env::var(key).ok().and_then(|raw| raw.parse().ok())
}
pub fn parse_required<T>(key: &str) -> T
where
T: FromStr,
<T as FromStr>::Err: std::fmt::Display,
{
let raw = required(key);
raw.parse()
.unwrap_or_else(|err| panic!("invalid {key}='{raw}': {err}"))
}
pub fn parse_or<T>(key: &str, default: T) -> T
where
T: FromStr,
{
parse(key).unwrap_or(default)
}
pub fn flag(key: &str) -> bool {
matches!(
std::env::var(key).ok().as_deref(),
Some("1" | "true" | "TRUE" | "yes" | "YES" | "on" | "ON")
)
}
}
pub mod runtime {
env_keys! {
AUTO_WAIT_DELAY_NS = "MYELON_AUTO_WAIT_DELAY_NS";
AUTO_WAIT_DELAY_US = "MYELON_AUTO_WAIT_DELAY_US";
AUTO_CONSUMER_CORE = "MYELON_AUTO_CONSUMER_CORE";
PRODUCER_CORE = "MYELON_PRODUCER_CORE";
CONSUMER_CORE = "MYELON_CONSUMER_CORE";
PROCESS_CORE = "MYELON_PROCESS_CORE";
SHUTDOWN_GRACE_MS = "MYELON_SHUTDOWN_GRACE_MS";
BLOCK_STRATEGY_US = "MYELON_BLOCK_STRATEGY_US";
BLOCK_STRATEGY_MS = "MYELON_BLOCK_STRATEGY_MS";
DISCOVERY_POLL_MS = "MYELON_DISCOVERY_POLL_MS";
CONSUME_SLEEP_US = "MYELON_CONSUME_SLEEP_US";
SLEEP_YIELD_THRESHOLD_US = "MYELON_SLEEP_YIELD_THRESHOLD_US";
CONSUMER_BUSY_WAIT_US = "MYELON_CONSUMER_BUSY_WAIT_US";
}
}
#[cfg(dst)]
pub mod dst {
pub mod buggify {
env_keys! {
ENABLED = "MYELON_DST_BUGGIFY";
SEED = "MYELON_DST_BUGGIFY_SEED";
ACTIVATION_PERCENT = "MYELON_DST_BUGGIFY_ACTIVATION_PERCENT";
FIRE_PERCENT = "MYELON_DST_BUGGIFY_FIRE_PERCENT";
}
}
}