cuelang随笔:
1、通过context.CompileString把string转换为cue.value,或通过context.encode把go类型转换为cue.value,或通过context.BuildInstance把instance转换为cue.value。之后通过value.Syntax把cue.value转换为抽象语法树ast,通过format.Node格式化打印AST。
2、CUE 将 类型(types) 和 数据(values) 合并为一个概念:格,且CUE非常重视约束,用 约束条件(constraint)来管理值的规则或限制,像其他所有的实体一样,它存在于结构和具体数值中间。
3、cue的值不能被改变,在 CUE 中没有重载或重写的概念,只能由大范围到小范围,且lists must have the same elements and cannot change length。
[...sting] string的数组,close,赋值之后则长度不可变;
[string,...] 容量是1的数组,open,长度可变;
4、Top 和 Bottom 是 CUE 的特殊类型,他们是 格 的两端。
“_” 用来表示 top,可以匹配所有值,即 “any”;
“_|_” 用来表示 bottom,代表错误;
5、Definition 主要用于定义结构,也就是变量,默认情况下是封闭(Close)的,而且 CUE 导出时不会被输出。默认情况下,struct 是开放的,而 definition 是封闭的。
6、隐式字段和值通过在前面增加下划线定义,只可以在当前 package 进行引用
基础知识:
CUE能够安全地更改可修改配置中成千上万个对象的值。
1、数据类型:int、float、bool、string、array、struct、null
2、运算符#定义变量: #abc: string
3、运算符...定义开放的结构体和数组: close的数组对象 [...string] ,open的数组对象[string,...],说明该对象可以容纳多个字符串元素结构体对象;
{
abc: string
...
}
说明结构体可以包含未知字段;
4、运算符 | 表示两种类型的值。a: string | int 说明变量 a 表示类型可以是字符串或者整数类型。
5、运算符 * 定义变量的默认值。通常与符号 | 配合使用,代表某种类型的默认值。a: *1 | int说明变量 a 类型为 int,默认值为 1。
6、运算符 ?: 定义可选变量,某些情况下一些变量不一定被使用,这些变量就是选填。a ?: int说明a是可选填的变量。并且,选填变量通常和条件判断逻辑一起使用。 _ | _ 可选变量是否被填充。
7、运算符 if...else
price: number
feel: *"good" | string
if price > 100 {
feel: "bad"
}
price: 200
8、运算符for循环
8.1、切片遍历
package cue
parameter: {
name: string
image: string
env: [...{name:string,value:string}]
}
output: {
spec: {
containers: [{
name: parameter.name
image: parameter.image
env: [
for _, v in parameter.env {
name: v.name
value: v.value
},
]
}]
}
}
parameter:{
name: "mytest"
image: "nginx:v1"
env: [
{name:"a",value:"b"},
{name:"c",value:"d"},
]
}
8.2、类型遍历
package cue
#a: {
"hello": "Barcelona"
"nihao": "Shanghai"
}
for k, v in #a {
"\(k)": {
nameLen: len(v)
value: v
}
}
8.3、映射遍历
package cue
parameter: {
name: string
image: string
env: [string]: string
}
output: {
spec: {
containers: [{
name: parameter.name
image: parameter.image
env: [
for k, v in parameter.env {
name: k
value: v
},
]
}]
}
}
parameter:{
name: "mytest"
image: "nginx:v1"
env: "a": "b"
}
9、运算符\() 进行字符串内部计算,"\(k)"说明取k变量的实际值。
10、cue命令
// 计算、渲染结果
cue eval first.cue
// 计算、渲染结果,指定只计算某个值
cue eval first.cue -e out
// 导出最终渲染结果
cue export first.cue --out yaml > first.yaml
11、
Unify 就是 CUE 中的 & 操作符,对字段、规则、数据进行合并,并返回聚合后的结果;
Fill在指定的路径上更新或创建;