Referensi API Common Expression Language (CEL)

Dokumen ini berfungsi sebagai referensi Dokumen API terpadu untuk Common Expression Language (CEL). Dokumen ini mencantumkan semua makro, operator, dan fungsi standar, yang menunjukkan tanda tangan, perilaku, dan status dukungannya di seluruh stack CEL resmi.

Untuk mengetahui detail selengkapnya tentang perilaku dan spesifikasi bahasa, lihat Definisi Bahasa CEL.

Versi Stack

Dokumen referensi ini didasarkan pada versi stack CEL berikut:

  • CEL Go: v0.29.2 (dan yang lebih baru)
  • CEL C++: v0.15.0
  • CEL Java: v0.13.1
  • CEL Python: v0.1.3
  • CEL C: Snapshot pengembangan (belum dirilis)

Duplikasi GitHub

Implementasi resmi CEL diduplikasi di GitHub di organisasi cel-expr:


1. Makro Inti

Ini adalah makro bawaan yang diperluas pada waktu kompilasi.

Makro Deskripsi Go C++ Java Python C
has(container.field) Menguji apakah kolom ada dalam pesan, atau kunci dalam peta.

Tanda Tangan:
has(container.field) -> bool

Contoh:
has(request.auth.claims.email)
list.all(var, predicate) Menguji apakah semua elemen dalam daftar memenuhi predikat.

Tanda Tangan:
list.all(var, predicate) -> bool

Contoh:
[1, 2, 3].all(x, x > 0) // true
¹
list.exists(var, predicate) Menguji apakah setidaknya satu elemen dalam daftar memenuhi predikat.

Tanda tangan:
list.exists(var, predicate) -> bool

Contoh:
[1, 2, 3].exists(x, x > 2) // true
¹
list.exists_one(var, predicate) Menguji apakah tepat satu elemen dalam daftar memenuhi predikat.

Tanda tangan:
list.exists_one(var, predicate) -> bool

Contoh:
[1, 2, 3].exists_one(x, x == 2) // true
¹
list.filter(var, predicate) Memfilter elemen daftar sesuai dengan predikat.

Tanda tangan:
list.filter(var, predicate) -> list

Contoh:
[1, 2, 3].filter(x, x > 1) // [2, 3]
¹
list.map(var, transform) Mengubah setiap elemen daftar menggunakan ekspresi.

Tanda tangan:
list.map(var, transform) -> list

Contoh:
[1, 2, 3].map(x, x * 2) // [2, 4, 6]
¹
list.map(var, filter, transform) Mengubah elemen daftar yang memenuhi predikat filter.

Tanda Tangan:
list.map(var, filter, transform) -> list

Contoh:
[1, 2, 3].map(x, x > 1, x * 2) // [4, 6]
¹

¹ Didukung di runtime C karena makro diperluas menjadi pemahaman selama kompilasi oleh compiler host.


2. Operator Inti

Operator Deskripsi Go C++ Java Python C
Aritmetika (+, -, *, /, %) Operasi aritmatika standar. Negasi (-x) dan Identitas (+x). Penggabungan daftar (list + list) didukung di Go, C++, Java, dan Python.

Tanda Tangan:
T + T -> T
T - T -> T
T * T -> T
T / T -> T
T % T -> T
-T -> T
+T -> T
list + list -> list

Contoh:
1 + 2 * 3 // 7
[1] + [2] // [1, 2]
²
Perbandingan (==, !=, <, <=, >, >=) Perbandingan standar. Perbandingan numerik bersifat heterogen (misalnya, 1 == 1.0).

Tanda Tangan:
T == T -> bool
T != T -> bool
T < T -> bool
T <= T -> bool
T > T -> bool
T >= T -> bool

Contoh:
x < 42.0
1 == 1.0 // true
Logis (!, &&, ||, ? :) Logika NOT, AND, OR, dan Kondisional Ternary. DAN/ATAU gunakan evaluasi short-circuit.

Tanda tangan:
!bool -> bool
bool && bool -> bool
bool || bool -> bool
bool ? T : T -> T

Contoh:
x > 0 ? "positive" : "non-positive"
Pengindeksan ([]) Mengakses elemen daftar menurut indeks, atau kunci pencarian dalam peta.

Tanda tangan:
list[int] -> T
map[K] -> V

Contoh:
tags[0]
users['john']
Keanggotaan (in) Periksa apakah elemen ada dalam daftar, atau kunci ada dalam peta.

Tanda Tangan:
T in list -> bool
K in map -> bool

Contoh:
'admin' in roles

² Penggabungan daftar (list + list) tidak didukung di runtime C, meskipun operator aritmatika lainnya didukung.


3. Fungsi Inti

Fungsi Umum & String

Fungsi Deskripsi Go C++ Java Python C
size Menampilkan ukuran string (karakter), byte, daftar, atau peta.

Tanda tangan:
size(T) -> int (dengan T adalah string, bytes, list, atau map)<br /><br />**Examples:**<br />size("hello") // 5`
contains Menampilkan apakah string berisi substring.

Tanda tangan:
string.contains(string) -> bool

Contoh:
"hello".contains("ell") // true
startsWith Menampilkan apakah string dimulai dengan awalan.

Tanda Tangan:
string.startsWith(string) -> bool

Contoh:
"hello".startsWith("he") // true
endsWith Menampilkan apakah string diakhiri dengan akhiran.

Tanda Tangan:
string.endsWith(string) -> bool

Contoh:
"hello".endsWith("lo") // true
matches Menampilkan apakah string cocok dengan ekspresi reguler RE2.

Tanda Tangan:
string.matches(string) -> bool

Contoh:
"123".matches(r"^\d+$") // true

Fungsi Pemilih Tanggal dan Waktu

Fungsi ini mengekstrak komponen dari google.protobuf.Timestamp atau google.protobuf.Duration.

Fungsi Deskripsi Go C++ Java Python C
getFullYear Menampilkan tahun 4 digit.

Tanda Tangan:
timestamp.getFullYear([tz]) -> int

Contoh:
timestamp("2026-07-23T00:00:00Z").getFullYear() // 2026
getMonth Menampilkan bulan (0-11).

Tanda tangan:
timestamp.getMonth([tz]) -> int

Contoh:
timestamp("2026-07-23T00:00:00Z").getMonth() // 6
getDayOfMonth Menampilkan hari dalam sebulan (1-31).

Tanda tangan:
timestamp.getDayOfMonth([tz]) -> int

Contoh:
timestamp("2026-07-23T00:00:00Z").getDayOfMonth() // 23
getDayOfWeek Menampilkan hari dalam seminggu (0 = Minggu).

Tanda tangan:
timestamp.getDayOfWeek([tz]) -> int

Contoh:
timestamp("2026-07-23T00:00:00Z").getDayOfWeek() // 4
getDayOfYear Menampilkan hari dalam setahun (0-365).

Tanda tangan:
timestamp.getDayOfYear([tz]) -> int

Contoh:
timestamp("2026-07-23T00:00:00Z").getDayOfYear() // 203
getHours Menampilkan jam (0-23).

Tanda tangan:
timestamp.getHours([tz]) -> int
duration.getHours() -> int

Contoh:
duration("1h30m").getHours() // 1
getMinutes Menampilkan menit (0-59).

Tanda Tangan:
timestamp.getMinutes([tz]) -> int
duration.getMinutes() -> int

Contoh:
duration("1h30m").getMinutes() // 30
getSeconds Menampilkan detik (0-59).

Tanda tangan:
timestamp.getSeconds([tz]) -> int
duration.getSeconds() -> int

Contoh:
duration("1h30m45s").getSeconds() // 45
getMilliseconds Menampilkan milidetik (0-999).

Tanda tangan:
timestamp.getMilliseconds([tz]) -> int
duration.getMilliseconds() -> int

Contoh:
duration("1.5s").getMilliseconds() // 500

Konversi Jenis

Jenis Target Deskripsi Go C++ Java Python C
bool Dikonversi menjadi boolean.

Tanda tangan:
bool(bool) -> bool
bool(string) -> bool

Contoh:
bool("true") // true
bytes Dikonversi menjadi byte.

Tanda Tangan:
bytes(bytes) -> bytes
bytes(string) -> bytes

Contoh:
bytes("hello") // b"hello"
double Dikonversi menjadi float presisi ganda.

Tanda Tangan:
double(double) -> double
double(int) -> double
double(uint) -> double
double(string) -> double

Contoh:
double(1) // 1.0
duration Mengonversi ke durasi.

Tanda tangan:
duration(duration) -> duration
duration(string) -> duration

Contoh:
duration("1.5s") // 1.5s duration
int Mengonversi ke bilangan bulat 64-bit yang telah ditandai.

Tanda tangan:
int(int) -> int
int(uint) -> int
int(double) -> int (membulatkan ke nol)
int(string) -> int
int(timestamp) -> int (detik sejak epoch)

Contoh:
int(1.5) // 1
string Mengonversi ke string.

Tanda tangan:
string(T) -> string (mendukung bool, int, uint, double, bytes, timestamp, duration)<br /><br />**Examples:**<br />string(1.5) // "1.5"`
timestamp Mengonversi ke stempel waktu.

Tanda tangan:
timestamp(timestamp) -> timestamp
timestamp(string) -> timestamp (RFC3339)

Contoh:
timestamp("2026-07-23T00:00:00Z")
uint Mengonversi ke bilangan bulat 64-bit tanpa tanda.

Tanda tangan:
uint(uint) -> uint
uint(int) -> uint
uint(double) -> uint
uint(string) -> uint

Contoh:
uint(1) // 1u
dyn Mengubah nilai menjadi jenis dinamis untuk pemeriksaan jenis.

Tanda tangan:
dyn(T) -> dyn

Contoh:
dyn([1, "two"])
type Menampilkan jenis nilai.

Tanda Tangan:
type(T) -> type

Contoh:
type(1) // int

4. Ekstensi (Library)

Library Pengikatan

Fungsi Deskripsi Go C++ Java Python C
cel.bind Mengikat variabel lokal untuk menghindari evaluasi duplikat.

Tanda Tangan:
cel.bind(varName, initExpr, resultExpr) -> T

Contoh:
cel.bind(x, a + b, x * x)
(v0.15.0) (v0.10.0) (v0.2.0) (v0.1.1)

Cara Mengaktifkan

Pustaka Encoder

Fungsi Deskripsi Go C++ Java Python C
base64.encode Mengenkode byte ke string base64.

Tanda tangan:
base64.encode(bytes) -> string

Contoh:
base64.encode(b"hello") // "aGVsbG8="
(v0.6.0) (v0.10.0) (v0.2.0) (v0.1.1)
base64.decode Mendekode string base64 ke byte. Menampilkan error pada input yang tidak valid.

Tanda tangan:
base64.decode(string) -> bytes

Contoh:
base64.decode("aGVsbG8=") // b"hello"
(v0.6.0) (v0.10.0) (v0.2.0) (v0.1.1)
json.encode Menyerialkan nilai CEL ke string JSON.

Tanda Tangan:
json.encode(dyn) -> string

Contoh:
json.encode([1, 2]) // "[1,2]"
(v0.29.0)

Cara Mengaktifkan

Library Matematika

Fungsi Deskripsi Go C++ Java Python C
math.greatest Menampilkan argumen numerik terbesar (atau daftar numerik).

Tanda tangan:
math.greatest(arg, ...) -> T

Contoh:
math.greatest(1, 3, 2) // 3
(v0.13.0) (v0.10.0) (v0.2.0) (v0.1.1)
math.least Menampilkan argumen numerik terkecil (atau daftar numerik).

Sintaksis:
math.least(arg, ...) -> T

Contoh:
math.least([1, 3, 2]) // 1
(v0.13.0) (v0.10.0) (v0.2.0) (v0.1.1)
math.abs Nilai absolut.

Tanda tangan:
math.abs(T) -> T (mendukung int, uint, double)<br /><br />**Examples:**<br />math.abs(-1) // 1`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.sqrt Akar kuadrat.

Tanda tangan:
math.sqrt(T) -> double (mendukung int, uint, double)<br /><br />**Examples:**<br />math.sqrt(9) // 3.0`
(v0.25.1) (v0.12.0) (v0.11.0) (v0.1.1)
math.bitAnd Bitwise AND.

Tanda tangan:
math.bitAnd(T, T) -> T (mendukung int, uint)<br /><br />**Examples:**<br />math.bitAnd(5, 3) // 1`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitOr Bitwise OR.

Tanda tangan:
math.bitOr(T, T) -> T (mendukung int, uint)<br /><br />**Examples:**<br />math.bitOr(5, 3) // 7`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitXor Bitwise XOR.

Tanda tangan:
math.bitXor(T, T) -> T (mendukung int, uint)<br /><br />**Examples:**<br />math.bitXor(5, 3) // 6`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitNot Bitwise NOT.

Tanda tangan:
math.bitNot(T) -> T (mendukung int, uint)<br /><br />**Examples:**<br />math.bitNot(1) // -2`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitShiftLeft Bitwise shift left.

Tanda tangan:
math.bitShiftLeft(T, int) -> T (mendukung int, uint)<br /><br />**Examples:**<br />math.bitShiftLeft(1, 2) // 4`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitShiftRight Bitwise shift right.

Tanda tangan:
math.bitShiftRight(T, int) -> T (mendukung int, uint)<br /><br />**Examples:**<br />math.bitShiftRight(4, 2) // 1`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.ceil Pembulatan ke atas.

Tanda tangan:
math.ceil(double) -> double

Contoh:
math.ceil(1.2) // 2.0
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.floor Pembulatan ke bawah.

Tanda tangan:
math.floor(double) -> double

Contoh:
math.floor(1.8) // 1.0
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.round Pembulatan bilangan bulat terdekat.

Tanda tangan:
math.round(double) -> double

Contoh:
math.round(1.5) // 2.0
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.trunc Pembulatan pemotongan (menuju nol).

Tanda tangan:
math.trunc(double) -> double

Contoh:
math.trunc(-1.8) // -1.0
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.isInf Memeriksa apakah ganda adalah tak terhingga positif atau negatif.

Tanda Tangan:
math.isInf(double) -> bool

Contoh:
math.isInf(1.0/0.0) // true
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.isNaN Memeriksa apakah ganda adalah NaN.

Tanda Tangan:
math.isNaN(double) -> bool

Contoh:
math.isNaN(0.0/0.0) // true
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.isFinite Memeriksa apakah ganda terbatas.

Tanda Tangan:
math.isFinite(double) -> bool

Contoh:
math.isFinite(1.2) // true
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.sign Menampilkan tanda nilai (-1, 0, atau 1).

Tanda Tangan:
math.sign(T) -> T (mendukung int, uint, double)<br /><br />**Examples:**<br />math.sign(-42) // -1`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)

Cara Mengaktifkan

Library Protos

Fungsi Deskripsi Go C++ Java Python C
proto.getExt Mendapatkan kolom ekstensi proto2, atau default jika tidak ditetapkan.

Tanda tangan:
proto.getExt(msg, extName) -> T

Contoh:
proto.getExt(msg, google.api.expr.test.int32_ext)
(v0.13.0) (v0.10.0) (v0.2.0) (v0.1.1)
proto.hasExt Memeriksa apakah kolom ekstensi proto2 disetel.

Tanda tangan:
proto.hasExt(msg, extName) -> bool

Contoh:
proto.hasExt(msg, google.api.expr.test.int32_ext)
(v0.13.0) (v0.10.0) (v0.2.0) (v0.1.1)

Cara Mengaktifkan

Library Daftar

Fungsi Deskripsi Go C++ Java Python C
distinct Menampilkan elemen yang berbeda.

Tanda tangan:
list.distinct() -> list

Contoh:
[1, 2, 2].distinct() // [1, 2]
(v0.22.0) (v0.11.0) (v0.11.0) (v0.1.1)
flatten Meratakan daftar bertingkat.

Tanda tangan:
list.flatten([depth]) -> list

Contoh:
[[1], [2, 3]].flatten() // [1, 2, 3]
(v0.22.0) (v0.11.0) (v0.7.1) (v0.1.1)
lists.range Menampilkan daftar bilangan bulat [0, ..., n-1].

Tanda Tangan:
lists.range(int) -> list(int)

Contoh:
lists.range(3) // [0, 1, 2]
(v0.22.0) (v0.11.0) (v0.10.1) (v0.1.1)
reverse Membalikkan daftar.

Tanda tangan:
list.reverse() -> list

Contoh:
[1, 2].reverse() // [2, 1]
(v0.22.0) (v0.11.0) (v0.11.0) (v0.1.1)
slice Menampilkan sub-daftar (start inklusif, end eksklusif).

Tanda tangan:
list.slice(start, end) -> list

Contoh:
[1, 2, 3].slice(1, 3) // [2, 3]
(v0.17.0) (v0.11.0) (v0.11.0) (v0.1.1)
sort Mengurutkan daftar elemen yang dapat dibandingkan.

Tanda Tangan:
list.sort() -> list

Contoh:
[3, 1, 2].sort() // [1, 2, 3]
(v0.22.0) (v0.11.0) (v0.11.0) (v0.1.1)
sortBy Mengurutkan daftar berdasarkan kunci yang dievaluasi dari ekspresi.

Tanda tangan:
list.sortBy(var, expr) -> list

Contoh:
[{"val": 2}, {"val": 1}].sortBy(x, x.val) // [{"val": 1}, {"val": 2}]
(v0.22.0) (v0.11.0) (v0.11.0) (v0.1.1)
first Menampilkan elemen pertama sebagai opsional. Memerlukan perpanjangan waktu Opsional.

Tanda tangan:
list.first() -> optional

Contoh:
[1, 2].first() // optional(1)
(v0.23.0) (v0.15.0) (v0.11.0) (v0.1.2)
last Menampilkan elemen terakhir sebagai opsional. Memerlukan perpanjangan waktu Opsional.

Tanda tangan:
list.last() -> optional

Contoh:
[1, 2].last() // optional(2)
(v0.23.0) (v0.15.0) (v0.11.0) (v0.1.2)

Cara Mengaktifkan

Library Set

Fungsi Deskripsi Go C++ Java Python C
sets.contains Memeriksa apakah list1 berisi semua elemen list2.

Tanda tangan:
sets.contains(list1, list2) -> bool

Contoh:
sets.contains([1, 2], [1]) // true
(v0.15.0) (v0.10.0) (v0.6.0) (v0.1.1)
sets.equivalent Memeriksa apakah daftar setara (berisi elemen unik yang sama).

Tanda tangan:
sets.equivalent(list1, list2) -> bool

Contoh:
sets.equivalent([1, 2], [2, 1, 1]) // true
(v0.15.0) (v0.10.0) (v0.6.0) (v0.1.1)
sets.intersects Memeriksa apakah daftar memiliki minimal satu elemen yang sama.

Tanda Tangan:
sets.intersects(list1, list2) -> bool

Contoh:
sets.intersects([1, 2], [2, 3]) // true
(v0.15.0) (v0.10.0) (v0.6.0) (v0.1.1)

Cara Mengaktifkan

Library String

Fungsi Deskripsi Go C++ Java Python C
charAt Menampilkan karakter pada indeks.

Tanda tangan:
string.charAt(int) -> string

Contoh:
"hello".charAt(1) // "e"
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
indexOf Menampilkan indeks kemunculan pertama substring, atau -1.

Tanda Tangan:
string.indexOf(substr, [start]) -> int

Contoh:
"hello".indexOf("l") // 2
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
lastIndexOf Menampilkan indeks kemunculan terakhir substring, atau -1.

Tanda tangan:
string.lastIndexOf(substr, [end]) -> int

Contoh:
"hello".lastIndexOf("l") // 3
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
join Menggabungkan string.

Tanda tangan:
list(string).join([separator]) -> string

Contoh:
["a", "b"].join("-") // "a-b"
(v0.10.0) (v0.10.0) (v0.2.0) (v0.1.1)
split Memisahkan string berdasarkan pemisah.

Tanda tangan:
string.split(separator, [limit]) -> list(string)

Contoh:
"a-b".split("-") // ["a", "b"]
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
substring Menampilkan substring (mulai inklusif, akhir eksklusif).

Tanda tangan:
string.substring(start, [end]) -> string

Contoh:
"hello".substring(1, 3) // "el"
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
trim Memangkas spasi kosong Unicode.

Tanda tangan:
string.trim() -> string

Contoh:
" hello ".trim() // "hello"
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
replace Mengganti kemunculan lama dengan yang baru.

Tanda Tangan:
string.replace(old, new, [limit]) -> string

Contoh:
"hello".replace("l", "w") // "hewwo"
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
reverse Membalikkan poin kode Unicode.

Tanda tangan:
string.reverse() -> string

Contoh:
"abc".reverse() // "cba"
(v0.18.0) (v0.14.0) (v0.13.0) (v0.1.1)
lowerAscii Mengonversi karakter ASCII menjadi huruf kecil.

Tanda Tangan:
string.lowerAscii() -> string

Contoh:
"Hello".lowerAscii() // "hello"
(v0.6.0) (v0.11.0) (v0.2.0) (v0.1.1)
upperAscii Mengonversi karakter ASCII menjadi huruf besar.

Tanda tangan:
string.upperAscii() -> string

Contoh:
"Hello".upperAscii() // "HELLO"
(v0.6.0) (v0.11.0) (v0.2.0) (v0.1.1)
quote Meng-escape string untuk pencetakan yang aman.

Tanda tangan:
strings.quote(string) -> string

Contoh:
strings.quote("a\tb") // "\"a\\tb\""
(v0.14.0) (v0.14.0) (v0.13.0) (v0.1.1)

Cara Mengaktifkan

Pustaka Ekspresi Reguler

Fungsi Deskripsi Go C++ Java Python C
regex.replace Mengganti kecocokan dengan string pengganti (mendukung referensi balik).

Tanda tangan:
regex.replace(target, pat, repl, [limit]) -> string

Contoh:
regex.replace("123-456", r"(\d+)-(\d+)", r"\2-\1") // "456-123"
(v0.25.1) (v0.13.0) (v0.10.1) (v0.1.1)
regex.extract Menampilkan kecocokan pertama pola (harus memiliki satu grup tangkapan).

Tanda tangan:
regex.extract(target, pat) -> optional(string)

Contoh:
regex.extract("a123b", r"(\d+)") // optional("123")
(v0.25.1) (v0.13.0) (v0.10.1) (v0.1.1)
regex.extractAll Menampilkan semua kecocokan pola (harus memiliki satu grup tangkapan).

Tanda Tangan:
regex.extractAll(target, pat) -> list(string)

Contoh:
regex.extractAll("a1b2", r"(\d+)") // ["1", "2"]
(v0.25.1) (v0.13.0) (v0.10.1) (v0.1.1)

Cara Mengaktifkan

Pemahaman Dua Variabel

Makro Deskripsi Go C++ Java Python C
all Memperpendek AND logika melalui kunci/indeks dan nilai.

Tanda tangan:
list.all(i, v, pred) -> bool
map.all(k, v, pred) -> bool

Contoh:
[1, 2].all(i, v, v > 0) // true
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
exists Memperpendek OR logika melalui kunci/indeks dan nilai.

Tanda Tangan:
list.exists(i, v, pred) -> bool
map.exists(k, v, pred) -> bool

Contoh:
[1, 2].exists(i, v, v == 2) // true
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
existsOne Memeriksa apakah tepat satu pasangan memenuhi predikat.

Tanda tangan:
list.existsOne(i, v, pred) -> bool
map.existsOne(k, v, pred) -> bool

Contoh:
[1, 2].existsOne(i, v, v == 2) // true
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
transformList Mengubah/memfilter daftar/peta menjadi daftar.

Tanda tangan:
list.transformList(i, v, [filter], transform) -> list
map.transformList(k, v, [filter], transform) -> list

Contoh:
[1, 2].transformList(i, v, v * 2) // [2, 4]
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
transformMap Mengubah nilai daftar/peta menjadi peta (kunci tetap).

Tanda tangan:
list.transformMap(i, v, [filter], transform) -> map
map.transformMap(k, v, [filter], transform) -> map

Contoh:
[1, 2].transformMap(i, v, v * 2) // {0: 2, 1: 4}
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
transformMapEntry Berubah menjadi peta.

Tanda tangan:
list.transformMapEntry(i, v, [filter], transform_entry) -> map
map.transformMapEntry(k, v, [filter], transform_entry) -> map

Contoh:
[1, 2].transformMapEntry(i, v, {string(v): v * 2}) // {"1": 2, "2": 4}
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)

Cara Mengaktifkan

Native Types Library

Fitur Deskripsi Go C++ Java Python C
Struktur Native Mendaftarkan dan membuat instance jenis native host (struct Go / POJO Java) di CEL.

Contoh:
Account{id: 123} (POJO Java yang dibuat instance di CEL)
(v0.13.0) (v0.13.0)

Cara Mengaktifkan

Library Jaringan

Library Jaringan menyediakan fungsi untuk mengurai, memvalidasi, dan memanipulasi alamat IP dan blok CIDR.

Fungsi Deskripsi Go C++ Java Python C
ip Mengurai string menjadi alamat IP, atau mengekstrak IP dari CIDR.

Tanda Tangan:
ip(string) -> IP
CIDR.ip() -> IP

Contoh:
ip("192.168.0.1")
cidr("192.168.0.0/24").ip()
(v0.29.0)
isIP Memeriksa apakah string adalah alamat IP yang valid.

Tanda Tangan:
isIP(string) -> bool

Contoh:
isIP("192.168.0.1") // true
(v0.29.0)
ip.isCanonical Memeriksa apakah string alamat IP dalam format kanoniknya.

Tanda Tangan:
ip.isCanonical(string) -> bool

Contoh:
ip.isCanonical("192.168.0.1") // true
(v0.29.0)
cidr Mengurai string menjadi blok CIDR.

Tanda tangan:
cidr(string) -> CIDR

Contoh:
cidr("192.168.0.0/24")
(v0.29.0)
isCIDR Memeriksa apakah string adalah blok CIDR yang valid.

Tanda tangan:
isCIDR(string) -> bool

Contoh:
isCIDR("192.168.0.0/24") // true
(v0.29.0)
containsIP Memeriksa apakah blok CIDR berisi alamat IP.

Tanda tangan:
CIDR.containsIP(IP) -> bool
CIDR.containsIP(string) -> bool

Contoh:
cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true
(v0.29.0)
containsCIDR Memeriksa apakah blok CIDR berisi blok CIDR lain.

Tanda Tangan:
CIDR.containsCIDR(CIDR) -> bool
CIDR.containsCIDR(string) -> bool

Contoh:
cidr("192.168.0.0/16").containsCIDR(cidr("192.168.1.0/24")) // true
(v0.29.0)
family Menampilkan keluarga IP (4 untuk IPv4, 6 untuk IPv6).

Tanda Tangan:
IP.family() -> int

Contoh:
ip("192.168.0.1").family() // 4
(v0.29.0)
isGlobalUnicast Memeriksa apakah IP adalah alamat unicast global.

Tanda tangan:
IP.isGlobalUnicast() -> bool

Contoh:
ip("192.168.0.1").isGlobalUnicast() // true
(v0.29.0)
isLinkLocalMulticast Memeriksa apakah IP adalah alamat multicast link-local.

Tanda tangan:
IP.isLinkLocalMulticast() -> bool

Contoh:
ip("224.0.0.1").isLinkLocalMulticast() // true
(v0.29.0)
isLinkLocalUnicast Memeriksa apakah IP adalah alamat unicast link-local.

Tanda tangan:
IP.isLinkLocalUnicast() -> bool

Contoh:
ip("169.254.0.1").isLinkLocalUnicast() // true
(v0.29.0)
isLoopback Memeriksa apakah IP adalah alamat loopback.

Tanda tangan:
IP.isLoopback() -> bool

Contoh:
ip("127.0.0.1").isLoopback() // true
(v0.29.0)
isMask Memeriksa apakah CIDR adalah subnet mask yang valid.

Tanda tangan:
CIDR.isMask() -> bool

Contoh:
cidr("255.255.255.0/24").isMask() // true
(v0.29.0)
isUnspecified Memeriksa apakah IP adalah alamat yang tidak ditentukan (misalnya, 0.0.0.0).

Tanda tangan:
IP.isUnspecified() -> bool

Contoh:
ip("0.0.0.0").isUnspecified() // true
(v0.29.0)
masked Menampilkan blok CIDR yang di-masking.

Tanda Tangan:
CIDR.masked() -> CIDR

Contoh:
cidr("192.168.0.1/24").masked() // 192.168.0.0/24
(v0.29.0)
prefixLength Menampilkan panjang awalan blok CIDR.

Tanda Tangan:
CIDR.prefixLength() -> int

Contoh:
cidr("192.168.0.0/24").prefixLength() // 24
(v0.29.0)
string Mengonversi IP atau CIDR menjadi string.

Tanda tangan:
string(IP) -> string
string(CIDR) -> string

Contoh:
string(ip("192.168.0.1")) // "192.168.0.1"
(v0.29.0)

Cara Mengaktifkan

  • Go: Teruskan ext.Network() ke cel.NewEnv().
  • C++: Tidak didukung.
  • Java: Tidak didukung.
  • Python: Tidak didukung.

5. Fitur Lanjutan

Ringkasan Fitur Lanjutan

Fitur Deskripsi Go C++ Java Python C
Evaluasi Sebagian Mengevaluasi dengan input yang tidak ada; menampilkan nilai tidak diketahui atau ekspresi yang disederhanakan. ³
Evaluasi Asinkron Eksekusi serentak fungsi ekstensi yang tidak memblokir.
Validator AST Pemeriksaan analisis statis pada AST yang Diperiksa setelah pemeriksaan jenis.
Pengoptimal AST Penulisan ulang AST (pelipatan konstanta, penyisipan, CSE) untuk meningkatkan performa.
Pengompilasi Kebijakan CEL Mengompilasi struktur kebijakan berbasis YAML menjadi AST CEL standar.

³ Go mendukung pembuatan Residual AST (AST yang di-pruning). ⁴ C++ dan Java mendukung pengembalian UnknownSet / CelUnknownSet saat runtime, tetapi tidak mengekspos API publik untuk pembuatan AST residual. ⁵ Go menggunakan AsyncBinding / AsyncOp yang menampilkan saluran. ⁶ Java menggunakan CelAsyncRuntime yang menampilkan ListenableFuture.

Evaluasi Parsial (Tidak Diketahui)

Evaluasi parsial memungkinkan evaluasi ekspresi saat hanya subset variabel input (argumen) yang diketahui. Daripada gagal, evaluasi menghasilkan hasil yang menunjukkan apa yang kurang, atau ekspresi yang disederhanakan.

  • Go: Dukungan penuh. Memungkinkan penentuan PartialActivation dengan pola atribut yang tidak diketahui. Evaluasi menampilkan nilai types.Unknown. Go mendukung pembuatan AST Sisa (Env.ResidualAst) yang merupakan AST yang telah dipangkas dan disederhanakan yang hanya berisi bagian ekspresi yang tidak dapat dievaluasi.
  • C++: Mendukung nilai Unknown. Pola atribut yang tidak diketahui dikonfigurasi melalui Activation::set_unknown_attribute_patterns. Evaluasi menampilkan UnknownSet. API publik saat ini tidak mengekspos pembuatan AST sisa.
  • Java: Mendukung evaluasi parsial melalui PartialVars yang diteruskan ke Program.eval(). Evaluasi menampilkan CelUnknownSet. API publik saat ini tidak mengekspos pembuatan AST residual.
  • Python / C: Tidak ada dukungan native.

Evaluasi Asinkron

Evaluasi asinkron memungkinkan ekspresi CEL memanggil fungsi yang dieksekusi secara asinkron (misalnya, membuat RPC atau kueri database) dan memblokir evaluasi hingga hasilnya tersedia, tanpa memblokir thread eksekusi utama.

  • Go: Mendukung penggantian fungsi asinkron melalui AsyncBinding dan AsyncOp. Fungsi asinkron menampilkan channel Go (<-chan ref.Val), dan interpreter mengelola eksekusi dan sinkronisasi serentak.
  • Java: Mendukung evaluasi asinkron melalui CelAsyncRuntime dan AsyncProgram. Library ini menggunakan ListenableFuture untuk merepresentasikan nilai yang tertunda dan secara otomatis mendorong evaluasi hingga selesai saat future diselesaikan.
  • C++ / Python / C: Tidak ada dukungan bawaan.

Validator AST

Validator melakukan analisis statis pada AST yang Diperiksa setelah pemeriksaan jenis untuk menerapkan batasan khusus domain sebelum program dieksekusi.

  • Go: Mendukung antarmuka ASTValidator. Validator kanonis mencakup cel.validator.duration, cel.validator.timestamp, cel.validator.matches (regex), cel.validator.homogeneous_literals, dan cel.validator.comprehension_nesting_limit.
  • C++: Mendukung cel::Validator. Validasi kanonis mencakup AstDepthValidator, ComprehensionNestingLimitValidator, DurationLiteralValidator, HomogeneousLiteralValidator, MatchesValidator, dan TimestampLiteralValidator.
  • Java: Mendukung CelValidator dan CelAstValidator. Validator kanonis mencakup AstDepthLimitValidator, ComprehensionNestingLimitValidator, DurationLiteralValidator, HomogeneousLiteralValidator, RegexLiteralValidator, dan TimestampLiteralValidator.
  • Python / C: Tidak ada dukungan langsung.

Pengoptimal AST

Pengoptimal menulis ulang AST untuk meningkatkan performa eksekusi. Pengoptimal termasuk dalam salah satu dari dua kategori: pengoptimal statis dan runtime. C++, Java, dan Go mendukung pengoptimalan runtime. CEL Java dan Go juga mendukung pengoptimal statis. Pengoptimalan umum mencakup pelipatan konstanta (pra-evaluasi sub-ekspresi dengan input konstanta) dan penghapusan subekspresi umum (CSE).

  • Go: Mendukung pelipatan AST selama kompilasi/perencanaan.
  • C++: Mendukung pelipatan konstanta melalui ekstensi cel::extensions::EnableConstantFolding pada waktu perencanaan.
  • Java: Mendukung antarmuka CelOptimizer. Pengoptimal kanonis mencakup ConstantFoldingOptimizer (yang dapat melipat cabang short-circuit dengan mensimulasikan evaluasi parsial), InliningOptimizer, dan SubexpressionOptimizer (CSE).
  • Python / C: Tidak ada dukungan langsung.

Compiler Kebijakan CEL

Kebijakan CEL adalah format berbasis YAML untuk menyusun beberapa ekspresi CEL bersama dengan variabel, blok kecocokan, output bersyarat, dan aturan bertingkat. Dirancang untuk mesin kebijakan yang kompleks (seperti Kontrol Penerimaan Kubernetes) yang membuat ekspresi CEL tunggal menjadi tidak dapat dibaca.

Pengompilasi Kebijakan mengompilasi kebijakan YAML ini menjadi satu AST CEL standar, yang berarti kebijakan tersebut sepenuhnya kompatibel dengan runtime CEL standar dan mewarisi semua jaminan performa dan keamanan.

  • Go: Didukung melalui third_party/cel/go/policy.
  • C++: Didukung melalui third_party/cel/cpp/policy.
  • Java: Didukung melalui third_party/java/cel/policy.
  • Python / C: Tidak didukung secara langsung.