打印 Cue



CUE 支持 fmt.Printf 修饰符,你可以快速打印 CUE 的值。 要在打印时进行细粒度控制,可以使用 cue/format 包。

使用 go/fmt 打印

print.go

package main

import (
	"fmt"

	"cuelang.org/go/cue"
	"cuelang.org/go/cue/cuecontext"
)

const val = `
i: int
s: string
t: [string]: string
_h: "hidden"
#d: foo: "bar"
`

func main() {
	var (
		c *cue.Context
		v cue.Value
	)

	// create a context
	c = cuecontext.New()

	// compile some CUE into a Value
	v = c.CompileString(val)

	// print the value
	fmt.Printf("// %%v\n%v\n\n// %%# v\n%# v\n", v, v)
}

go run print.go

// %v
{
	i: int
	s: string
	t: {}
}

// %# v
i: int
s: string
t: {
	[string]: string
}
_h: "hidden"
#d: {
	foo: "bar"
}

使用 cue/format 打印

当运行 cue eval 和 cue def 的时候 我们可以通过 flag 来控制打印格式选项。 这些 flag 可以映射到 cue.Option 类型。这种类型的用法常是传入 cue.Value.Syntax 函数, 这个函数可以返回 CUE 值的抽象语法树(Abstract Syntax Tree, AST)。 然后我们可以使用 format.Node 来格式化打印一个 CUE 的抽象语法树。

format.go

package main

import (
	"fmt"

	"cuelang.org/go/cue"
	"cuelang.org/go/cue/cuecontext"
	"cuelang.org/go/cue/format"
)

const val = `
i: int
s: string
t: [string]: string
_h: "hidden"
#d: foo: "bar"
`

func main() {
	var (
		c *cue.Context
		v cue.Value
	)

	// create a context
	c = cuecontext.New()

	// compile some CUE into a Value
	v = c.CompileString(val)

	// Generate an AST
	//   try out different options
	syn := v.Syntax(
		cue.Final(),         // close structs and lists
		cue.Concrete(false), // allow incomplete values
		cue.Definitions(false),
		cue.Hidden(true),
		cue.Optional(true),
		cue.Attributes(true),
		cue.Docs(true),
	)

	// Pretty print the AST, returns ([]byte, error)
	bs, _ := format.Node(
		syn,
		// format.TabIndent(false),
		// format.UseSpaces(2),
	)

	// print to stdout
	fmt.Println(string(bs))
}

go run format.go

{
	i: int
	s: string
	t: {}
	_h: "hidden"
	#d: {
		foo: "bar"
	}
}
链接:
cue.Value.Syntax - 把 Value 转换为 AST
cue.Option - Syntax 函数的选项 (也用于其他函数)
cue/format.Node - 格式化打印 AST
我们绝不会将你的邮箱分享给任何人。
2025 Hofstadter, Inc