打印 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 evalcue 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
我们绝不会将你的邮箱分享给任何人。
2022 Hofstadter, Inc