它们不会在求值时被处理,只是作为注释。它们也不能在 CUE 中被访问,而且需要你写 Go 去使用它们。
尽管是简单的标记,但是属性给自定义的 Go 工具提供强大的可扩展性和可配置型。
它们原本是为了辅助不同表现形式的映射,比如 Go 和 Protobuf。
然而,你可以给它们指定任何含义或行为,因为它们只能在你的应用中使用。
所以在这个意义上来说,它们和 Go 结构体的 tag 非常像。
属性有一些语法:
它们以 @ 开头,有一个标签以及括号
在字段后面或者在 struct 中
可以带有几个可选值,并用逗号分割不同的 key
value 都是字符串,可以是任何你想要的格式
format.cue
// field attributefoo: "bar" @attr()// declaration attributefoo: { @attr() bar: string}// they can have keysany: _ @attr(foo,bar)// keys have optional valuesany: _ @attr(key1,key2=value,key3="foo;bar")
packagemainimport"path"env: stringhost: string// urlPath is agnostic of environmenturlPath: "/path/to/asset"// url is derived from host and urlPathurl: "https://"+path.Join([host, urlPath])
// Attributes are collectedx: _ @foo(bar) @cow(moo)x: _ @foo(baz)// this can be problematicn: int @protobuf(1,int64)n: int @protobuf(2,int64)// field attributes don't propegatey: x
cue eval -A propagation-fields.cue
x: _ @foo(bar) @cow(moo) @foo(baz)n: int @protobuf(1,int64) @protobuf(2,int64)y: _
propagations-struct.cue
#X: { @model(db) uuid: string @key(primary)} @app(backend) // does not propagatex: #X & { @model(ui) // can build up uuid: string @key(secondary) // can conflict}y: { #X uuid: "abc-123"}
cue eval -A propagation-struct.cue
#X: { @model(db) uuid: string @key(primary)} @app(backend)x: { @model(db) @model(ui) // can build up uuid: string @key(primary) @key(secondary)}
由于下面的问题,字段属性不会传播
field-propagation-issue.cue
#A: { x: int @protobuf(1,int64) y: int @protobuf(2,int64)}a: #Aa: { x: 1 y: x // propagation here}
cue eval -A field-propagation-issue.cue
#A: { x: int @protobuf(1,int64) y: int @protobuf(2,int64)}a: { x: 1 @protobuf(1,int64) y: 1 @protobuf(2,int64)}// would result in a conflict for indexesa: { y: 1 @protobuf(1,int64) @protobuf(2,int64)}