The cue command allows non-CUE data to be “placed” at a specific location in its evaluation with the --path/-l flag. This guide demonstrates how to achieve the same result using the Go API.

Set up the environment

1

If you don’t already have CUE or Go modules, initialize them:

TERMINAL
$ cue mod init cue.example
$ go mod init go.example
...

Create some data files

2

Write some CUE code and JSON data (if you don’t already have some code that you want to update and use):

some.cue
package example

// The data will be placed at this location.
input: {
	name!:    string
	location: *"your part of the world" | string
}

output: """
    Hello, \(input.name)!
    How's the weather in \(input.location)?
    """
input.json
{
    "name": "Charlie"
}
3

Check that the data file can be combined successfully with the CUE:

TERMINAL
$ cue export . input.json --path input: -e output --out text
Hello, Charlie!
How's the weather in your part of the world?

Write some Go

4

Write a Go program that places the data in the input.json file at a specific location within its CUE evaluation (or adapt your existing code to do the same):

main.go
package main

import (
	"fmt"
	"log"
	"os"

	"cuelang.org/go/cue"
	"cuelang.org/go/cue/cuecontext"
	"cuelang.org/go/cue/load"
	"cuelang.org/go/encoding/json"
)

func main() {
	ctx := cuecontext.New()
	// Load the package in the current directory.
	bis := load.Instances([]string{"."}, nil)
	v := ctx.BuildInstance(bis[0])

	// Load the input data.
	jsonBytes, err := os.ReadFile("input.json")
	if err != nil {
		log.Fatal(err)
	}

	// Parse the input data to a CUE expression.
	jsonData, err := json.Extract("input.json", jsonBytes)
	if err != nil {
		log.Fatal(err)
	}

	// Place the parsed data as the value of the "input" field.
	complete := v.FillPath(cue.ParsePath("input"), jsonData)

	// Extract the string value of the "output" field and print it.
	output := complete.LookupPath(cue.ParsePath("output"))
	msg, _ := output.String() // We know that "output" is a string type.
	fmt.Printf("%v\n", msg)
}

Run the program

5

Add a dependency on cuelang.org/go and ensure the Go module is tidy:

TERMINAL
$ go get cuelang.org/go@v0.11.0
...
$ go mod tidy
...
6

Run the program, printing the same multi-line string value that cue produced earlier:

TERMINAL
$ go run .
Hello, Charlie!
How's the weather in your part of the world?