use std::sync::OnceLock;
use crate::error::DogeResult;
use crate::stdlib::str_arg;
use crate::value::Value;
static SCRIPT_ARGS: OnceLock<Vec<String>> = OnceLock::new();
pub fn set_script_args(args: Vec<String>) {
let _ = SCRIPT_ARGS.set(args);
}
pub fn env_args() -> DogeResult {
let args = SCRIPT_ARGS
.get()
.map(|args| args.iter().map(Value::str).collect())
.unwrap_or_default();
Ok(Value::list(args))
}
pub fn env_get(name: &Value) -> DogeResult {
let name = str_arg("env", "get", name)?;
match std::env::var(name) {
Ok(value) => Ok(Value::str(value)),
Err(_) => Ok(Value::None),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn args_default_to_empty() {
match env_args().unwrap() {
Value::List(items) => assert!(items.borrow().is_empty()),
_ => panic!("expected a list"),
}
}
#[test]
fn get_of_an_unset_variable_is_none() {
let unset = Value::str("DOGE_SURELY_UNSET_VARIABLE_KABOSU");
assert!(matches!(env_get(&unset).unwrap(), Value::None));
}
}