Show HN: CEL 示例
发布: (2026年2月18日 GMT+8 22:05)
3 分钟阅读
原文: Hacker News
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)