1use std::sync::LazyLock;
2
3use hcl::eval::{Context, FuncDef};
4use hcl::Value;
5
6static GLOBAL_CONTEXT: LazyLock<Context> = LazyLock::new(|| {
7 dotenv::dotenv().ok();
8 let mut ctx = Context::new();
9 let env_func = FuncDef::builder().param(hcl::eval::ParamType::String).build(|args| {
10 let [Value::String(key)] = &args.into_values()[..] else {
11 return Err("Invalid argument, expected 1 string argument".into());
12 };
13 let value = std::env::var(key).map_err(|e| format!("env(`${key}`): {e:?}"))?;
14 Ok(Value::String(value))
15 });
16 ctx.declare_func("env", env_func);
17
18 ctx.declare_var(
19 "env",
20 Value::Object(std::env::vars().map(|(k, v)| (k, Value::String(v))).collect()),
21 );
22 ctx
23});
24
25pub fn hcl_context() -> Context<'static> {
27 GLOBAL_CONTEXT.clone()
28}