← Library I/ODeterministic

EnvOp

Reads an environment variable by name. Returns empty string if unset.

Inputs

FieldTypeDescription
Name*stringEnvironment variable name

Outputs

FieldTypeDescription
ValuestringVariable value, or empty string if not set

Returns empty string on miss. Use IfEmptyStringOp downstream to detect and handle an unset variable.

Typical Use Cases

  • Reading API keys from the environment
  • Loading environment-specific configuration
  • Injecting runtime values into a workflow

Complete Runnable Example

Reads the APP_ENV environment variable and prints its value.

main.go
package main

import (
	"context"
	"encoding/json"
	"log"
	"os"
	"time"

	"github.com/akennis/sparsi-go/library"
	_ "github.com/akennis/dagor/operator/builtin"

	"github.com/panjf2000/ants/v2"
	"github.com/akennis/dagor"
	"github.com/akennis/dagor/graph"
)

func main() {
	os.Setenv("APP_ENV", "production")

	varName := "APP_ENV"
	library.RegisterConst("env_name", varName)

	g, err := graph.NewBuilder("env_demo").
		Vertex("name_src").Op("env_name").
		Output("Result", "var_name_wire").

		Vertex("read_env").Op("EnvOp").
		Input("Name", "var_name_wire").
		Output("Value", "env_value").

		Build()
	if err != nil {
		log.Fatalf("build: %v", err)
	}

	pool, err := ants.NewPool(4)
	if err != nil {
		log.Fatalf("pool: %v", err)
	}
	defer pool.Release()

	eng, err := dagor.NewEngine(g, pool)
	if err != nil {
		log.Fatalf("engine: %v", err)
	}

	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	defer cancel()

	if err := eng.Run(ctx); err != nil {
		log.Fatalf("run: %v", err)
	}

	out := map[string]any{
		"var_name": varName,
	}
	if raw, ok := eng.GetOutput("env_value"); ok {
		out["env_value"] = *raw.(*string)
	}

	enc := json.NewEncoder(os.Stdout)
	enc.SetIndent("", "  ")
	enc.Encode(out)
}