Show HN: CEL 示例

发布: (2026年2月18日 GMT+8 22:05)
3 分钟阅读

Source: Hacker News

示例用户消息

{
  "name": "Alice",
  "roles": ["admin", "editor", "viewer"],
  "age": 30,
  "email": "alice@example.com",
  "created": timestamp("2025-12-14T00:00:00Z"),
  "email_verified": timestamp("2025-12-14T18:30:00Z")
}

字符串和数字

一个基本的比较:用户是否满 18 岁?

user.age >= 18
// result: true (bool)

使用字符串函数检查用户的电子邮件域名。

user.email.endsWith("@example.com")
// result: true (bool)

集合

用户是否拥有特定角色?in 用于检查列表中的成员关系。

"admin" in user.roles
// result: true (bool)

如果匹配不是完全相同的怎么办?exists() 用于测试是否有任何元素满足条件。

user.roles.exists(r, r.startsWith("ad"))
// result: true (bool)

用户有三个角色——如果我们只想要提升权限的角色呢?filter() 可以将列表缩小到匹配的元素。

user.roles.filter(r, r != "viewer")
// result: ["admin", "editor"] (list)

时间戳和持续时间

用户是否在注册后 24 小时内验证了电子邮件?CEL 原生支持时间——两个时间戳相减得到持续时间,然后进行比较。

user.email_verified - user.created = 18 && "admin" in user.roles
// result: true (bool)

条件运算符 允许分支逻辑。

user.age >= 18 ? "adult" : "minor"
// result: "adult" (string)

转换数据

CEL 表达式可以返回任意类型。构建一个映射,从用户对象中剔除 PII(个人身份信息)。

{
  "roles": user.roles,
  "is_adult": user.age >= 18
}
// result: {"roles": ["admin", "editor", "viewer"], "is_adult": true} (map)

为每个角色标注其是否为提升权限的角色。map() 将集合转换为新集合。

user.roles.map(r, {"role": r, "elevated": r != "viewer"})
// result: [{"role": "admin", "elevated": true}, {"role": "editor", "elevated": true}, {"role": "viewer", "elevated": false}] (list)

map() 也可以进行过滤——一次性选择提升权限的角色并授予写入权限。

user.roles.map(r, r != "viewer", r + ":write")
// result: ["admin:write", "editor:write"] (list)
0 浏览
Back to Blog

相关文章

阅读更多 »

EDuke32 – Duke Nukem 3D(开源)

是时候大干一场、嚼口香糖了,我的口香糖已经用完! Polymer renderer screenshot/images/shots/polymer2.jpg 每像素动态光照和实时阴影……