Skip to main content

robinpath_modules/modules/
env_mod.rs

1use robinpath::{RobinPath, Value};
2
3pub fn register(rp: &mut RobinPath) {
4    rp.register_builtin("env.get", |args, _| {
5        let name = args.first().map(|v| v.to_display_string()).unwrap_or_default();
6        let default = args.get(1).cloned().unwrap_or(Value::Null);
7        match std::env::var(&name) {
8            Ok(val) => Ok(Value::String(val)),
9            Err(_) => Ok(default),
10        }
11    });
12
13    rp.register_builtin("env.set", |args, _| {
14        let name = args.first().map(|v| v.to_display_string()).unwrap_or_default();
15        let value = args.get(1).map(|v| v.to_display_string()).unwrap_or_default();
16        // SAFETY: Caller is responsible for ensuring no concurrent access to env vars
17        unsafe { std::env::set_var(&name, &value) };
18        Ok(Value::Bool(true))
19    });
20
21    rp.register_builtin("env.has", |args, _| {
22        let name = args.first().map(|v| v.to_display_string()).unwrap_or_default();
23        Ok(Value::Bool(std::env::var(&name).is_ok()))
24    });
25
26    rp.register_builtin("env.all", |_args, _| {
27        let mut obj = indexmap::IndexMap::new();
28        for (key, value) in std::env::vars() {
29            obj.insert(key, Value::String(value));
30        }
31        Ok(Value::Object(obj))
32    });
33
34    rp.register_builtin("env.delete", |args, _| {
35        let name = args.first().map(|v| v.to_display_string()).unwrap_or_default();
36        // SAFETY: Caller is responsible for ensuring no concurrent access to env vars
37        unsafe { std::env::remove_var(&name) };
38        Ok(Value::Bool(true))
39    });
40}