CUE是什么?

CUE 是一种开源数据验证语言和推理引擎,其根源在于逻辑编程。
尽管该语言不是通用编程语言,但它有许多应用,例如数据验证、数据模板、配置、查询、代码生成甚至脚本。
推理引擎可用于验证代码中的数据或将其作为代码生成管道的一部分。

image.png
官网地址:https://cuelang.org/
官方文档:https://cuelang.org/docs/
官方github地址:https://github.com/cue-lang/cue

如果硬要问我,CUE 到底是啥?
你暂先可以理解是 超级JSON 就行,他比传统的 JSON、YAML 这类数据载体,拥有更多的新特性,比如数据验证,比如数据模板等。


当我们学一个新东西之前,总得先问自己:
这个新起之秀他都解决了啥痛点?
接下来就给大家分享,我所了解到的:

独特的几点设计理念

类型就是值

CUE 不区分值和类型。这是一个强大的概念,它允许 CUE 定义超详细的约束,但它也大大简化了事情:没有单独的模式或数据定义语言可供学习,并且相关的语言结构,如 sum 类型、枚举,甚至 null 合并折叠到单个构造。
下面是这个概念的演示。在左侧可以看到一个 JSON 对象(在 CUE 语法中),其中包含有关莫斯科市的一些属性。中间一列显示了任何城市的可能模式。在右侧,可以看到数据和模式之间的混合,这是 CUE 的示例。

  1. moscow: {
  2. name: "Moscow"
  3. pop: 11.92M
  4. capital: true
  5. }
  1. municipality: {
  2. name: string
  3. pop: int
  4. capital: bool
  5. }
largeCapital: {
  name:    string
  pop:     >5M
  capital: true
}

通常,在 CUE 中,首先对类型进行广泛定义,描述所有可能的实例。然后缩小这些定义的范围,可能通过组合来自不同来源(部门、用户)的约束,直到保留一个具体的数据实例。

将配置与计算分开

有一段时间(似乎)需要进行复杂的计算来生成一些配置数据。但是,当需要快速进行更改时,配置语言的简单性可能是最重要的。这些显然是相互冲突的利益。
CUE 的立场是计算和配置应该分开。而 CUE 实际上使这变得容易。需要计算的数据可以在 CUE 之外生成并放入要混入的文件中。数据甚至可以在 CUE 的脚本层中生成并自动注入到配置管道中。这两种方法都依赖于 CUE 的属性,即添加此数据的顺序无关紧要。

解决数据约束和验证的痛点

CUE 解决最大的痛点就是数据的约束问题!
现有的数据载体格式,如 json,yaml 他并不能对数据进行约束,他仅仅是一个载体。
CUE 他可以对我们的数据进行合并,类似于模板嵌套,以及数据的预处理。

旋一个:

// 枚举
sexM: {
    sex_m: "男",
    sex_w: "女"
}
// 数据约束
#student: {
    name: string,
    sex: string,
    age: int
}
// 数据
student: #student &{
    name: "张三",
    sex: sexM.sex_m,
    age: 123
}

解析后可以得到:

$ cue export tt.cue -e student
{
    "name": "张三",
    "sex": "男",
    "age": 123
}

参考文档: