Skip to main content

anda_config/
context.rs

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
25/// Generate Context for HCL evaluation
26pub fn hcl_context() -> Context<'static> {
27    GLOBAL_CONTEXT.clone()
28}