Common Expression Language (CEL) API Referansı

Bu belge, Common Expression Language (CEL) için birleştirilmiş API dokümanı referansı olarak kullanılır. Resmi CEL yığınlarındaki imzalarını, davranışlarını ve destek durumlarını belirterek tüm makroları, operatörleri ve standart işlevleri listeler.

Dil davranışı ve spesifikasyonları hakkında daha fazla bilgi için CEL Language Definition'a (CEL Dil Tanımı) bakın.

Yığın Sürümleri

Bu referans belgesi, CEL yığınlarının aşağıdaki sürümlerine dayanmaktadır:

  • CEL Go: v0.29.2 (ve daha yeni)
  • CEL C++: v0.15.0
  • CEL Java: v0.13.1
  • CEL Python: v0.1.3
  • CEL C: Geliştirme anlık görüntüsü (yayınlanmamış)

GitHub aynaları

CEL'nin resmi uygulamaları, GitHub'da cel-expr kuruluşu altında yansıtılır:


1. Temel Makrolar

Bunlar, derleme sırasında genişletilen yerleşik makrolardır.

Makro Açıklama Go C++ Java Python C
has(container.field) Bir alanın mesajda veya bir haritadaki anahtarın mevcut olup olmadığını test eder.

İmzalar:
has(container.field) -> bool

Örnekler:
has(request.auth.claims.email)
list.all(var, predicate) Listedeki tüm öğelerin bir koşulu karşılayıp karşılamadığını test eder.

İmzalar:
list.all(var, predicate) -> bool

Örnekler:
[1, 2, 3].all(x, x > 0) // true
¹
list.exists(var, predicate) Listedeki en az bir öğenin bir yüklemi karşılayıp karşılamadığını test eder.

İmzalar:
list.exists(var, predicate) -> bool

Örnekler:
[1, 2, 3].exists(x, x > 2) // true
¹
list.exists_one(var, predicate) Listedeki öğelerden yalnızca birinin bir yüklemi karşılayıp karşılamadığını test eder.

İmzalar:
list.exists_one(var, predicate) -> bool

Örnekler:
[1, 2, 3].exists_one(x, x == 2) // true
¹
list.filter(var, predicate) Bir listedeki öğeleri bir yükleme koşuluna göre filtreler.

İmzalar:
list.filter(var, predicate) -> list

Örnekler:
[1, 2, 3].filter(x, x > 1) // [2, 3]
¹
list.map(var, transform) Bir listedeki her öğeyi ifade kullanarak dönüştürür.

İmzalar:
list.map(var, transform) -> list

Örnekler:
[1, 2, 3].map(x, x * 2) // [2, 4, 6]
¹
list.map(var, filter, transform) Bir filtre koşulunu karşılayan liste öğelerini dönüştürür.

İmza:
list.map(var, filter, transform) -> list

�Örnekler:

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

¹ Makrolar, derleme sırasında ana derleyici tarafından comprehensions'a genişletildiği için C çalışma zamanında desteklenir.


2. Temel Operatörler

Operatör Açıklama Go C++ Java Python C
Aritmetik (+, -, *, /, %) Standart aritmetik işlemler. Olumsuzlama (-x) ve Kimlik (+x). Liste birleştirme (list + list) Go, C++, Java ve Python'da desteklenir.

İmzalar:
T + T -> T
T - T -> T
T * T -> T
T / T -> T
T % T -> T
-T -> T
+T -> T
list + list -> list

Örnekler:
1 + 2 * 3 // 7
[1] + [2] // [1, 2]
²
Karşılaştırma (==, !=, <, <=, >, >=) Standart karşılaştırma. Sayısal karşılaştırmalar heterojendir (ör. 1 == 1.0).

İmzalar:
T == T -> bool
T != T -> bool
T < T -> bool
T <= T -> bool
T > T -> bool
T >= T -> bool

Örnekler:
x < 42.0
1 == 1.0 // true
Mantıksal (!, &&, ||, ? :) Mantıksal DEĞİL, VE, VEYA ve Üçlü Koşullu. VEYA kısa devre değerlendirmesini kullanın.

İmzalar:
!bool -> bool
bool && bool -> bool
bool || bool -> bool
bool ? T : T -> T

Örnekler:
x > 0 ? "positive" : "non-positive"
Dizine ekleme ([]) Bir listenin öğesine dizinle erişin veya bir haritada arama anahtarı arayın.

İmzalar:
list[int] -> T
map[K] -> V

Örnekler:
tags[0]
users['john']
Üyelik (in) Öğenin listede veya anahtarın haritada olup olmadığını kontrol edin.

İmzalar:
T in list -> bool
K in map -> bool

Örnekler:
'admin' in roles

² Liste birleştirme (list + list), diğer aritmetik operatörler desteklenmesine rağmen C çalışma zamanında desteklenmez.


3. Temel işlevler

Genel ve Dize İşlevleri

İşlev Açıklama Go C++ Java Python C
size Bir dizenin (karakter), bayt, liste veya haritanın boyutunu döndürür.

İmzalar:
size(T) -> int (burada T, string, bytes, list veya map'dur)<br /><br />**Examples:**<br />size("hello") // 5`
contains Dizenin alt dize içerip içermediğini döndürür.

İmza:
string.contains(string) -> bool

Örnekler:
"hello".contains("ell") // true
startsWith Dizenin önekle başlayıp başlamadığını döndürür.

İmza:
string.startsWith(string) -> bool

Örnekler:
"hello".startsWith("he") // true
endsWith Dizenin sonekle bitip bitmediğini döndürür.

İmza:
string.endsWith(string) -> bool

Örnekler:
"hello".endsWith("lo") // true
matches Dizenin RE2 normal ifadesiyle eşleşip eşleşmediğini döndürür.

İmza:
string.matches(string) -> bool

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

Tarih ve Saat Seçici İşlevleri

Bu işlevler, google.protobuf.Timestamp veya google.protobuf.Duration öğelerinden bileşenleri ayıklar.

İşlev Açıklama Go C++ Java Python C
getFullYear 4 haneli yılı döndürür.

İmzalar:
timestamp.getFullYear([tz]) -> int

Örnekler:
timestamp("2026-07-23T00:00:00Z").getFullYear() // 2026
getMonth Ayı (0-11) döndürür.

İmza:
timestamp.getMonth([tz]) -> int

Örnekler:
timestamp("2026-07-23T00:00:00Z").getMonth() // 6
getDayOfMonth Ayın gününü (1-31) döndürür.

İmzalar:
timestamp.getDayOfMonth([tz]) -> int

Örnekler:
timestamp("2026-07-23T00:00:00Z").getDayOfMonth() // 23
getDayOfWeek Haftanın gününü (0 = Pazar) döndürür.

İmza:
timestamp.getDayOfWeek([tz]) -> int

Örnekler:
timestamp("2026-07-23T00:00:00Z").getDayOfWeek() // 4
getDayOfYear Yılın gününü (0-365) döndürür.

İmzalar:
timestamp.getDayOfYear([tz]) -> int

Örnekler:
timestamp("2026-07-23T00:00:00Z").getDayOfYear() // 203
getHours Saatleri (0-23) döndürür.

İmza:
timestamp.getHours([tz]) -> int
duration.getHours() -> int

Örnekler:
duration("1h30m").getHours() // 1
getMinutes Dakikayı (0-59) döndürür.

İmza:
timestamp.getMinutes([tz]) -> int
duration.getMinutes() -> int

Örnekler:
duration("1h30m").getMinutes() // 30
getSeconds Saniyeyi (0-59) döndürür.

İmzalar:
timestamp.getSeconds([tz]) -> int
duration.getSeconds() -> int

Örnekler:
duration("1h30m45s").getSeconds() // 45
getMilliseconds Milisaniyeleri (0-999) döndürür.

İmzalar:
timestamp.getMilliseconds([tz]) -> int
duration.getMilliseconds() -> int

Örnekler:
duration("1.5s").getMilliseconds() // 500

Tür Dönüşümleri

Hedef Türü Açıklama Go C++ Java Python C
bool Boole değerine dönüştürür.

İmza:
bool(bool) -> bool
bool(string) -> bool

Örnekler:
bool("true") // true
bytes Bayta dönüştürür.

İmza:
bytes(bytes) -> bytes
bytes(string) -> bytes

Örnekler:
bytes("hello") // b"hello"
double Çift duyarlıklı kayan nokta biçimine dönüştürür.

İmzalar:
double(double) -> double
double(int) -> double
double(uint) -> double
double(string) -> double

Örnekler:
double(1) // 1.0
duration Süreye dönüştürür.

İmza:
duration(duration) -> duration
duration(string) -> duration

Örnekler:
duration("1.5s") // 1.5s duration
int 64 bit imzalı tam sayıya dönüştürür.

İmzalar:
int(int) -> int
int(uint) -> int
int(double) -> int (sıfıra yuvarlar)
int(string) -> int
int(timestamp) -> int (dönemden beri geçen saniye sayısı)

Örnekler:
int(1.5) // 1
string Dizeye dönüştürür.

İmzalar:
string(T) -> string (bool, int, uint, double, bytes, timestamp, duration desteklenir)<br /><br />**Examples:**<br />string(1.5) // "1.5"`
timestamp Zaman damgasına dönüştürür.

İmzalar:
timestamp(timestamp) -> timestamp
timestamp(string) -> timestamp (RFC3339)

Örnekler:
timestamp("2026-07-23T00:00:00Z")
uint 64 bit işaretsiz tam sayıya dönüştürür.

İmzalar:
uint(uint) -> uint
uint(int) -> uint
uint(double) -> uint
uint(string) -> uint

Örnekler:
uint(1) // 1u
dyn Tür kontrolü için değeri dinamik türe dönüştürür.

İmzalar:
dyn(T) -> dyn

Örnekler:
dyn([1, "two"])
type Değerin türünü döndürür.

İmza:
type(T) -> type

Örnekler:
type(1) // int

4. Uzantılar (Kitaplıklar)

Bindings Library

İşlev Açıklama Go C++ Java Python C
cel.bind Yinelenen değerlendirmeyi önlemek için yerel bir değişkeni bağlar.

İmzalar:
cel.bind(varName, initExpr, resultExpr) -> T

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

Etkinleştirme

  • Git: cel.NewEnv()'a ext.Bindings() geçirin.
  • C++: CompilerBuilder öğesine BindingsCompilerLibrary() ekleyin. (Çalışma zamanı otomatik olarak yönetilir.)
  • Java: CelCompiler ve CelRuntime derleyicilerine CelExtensions.bindings() ekleyin.
  • Python: cel_expr_python.ext.ext_bindings öğesini içe aktarın ve cel.NewEnv(extensions=[...]) içinde ExtBindings() öğesini kullanın.

Kodlayıcı Kitaplığı

İşlev Açıklama Go C++ Java Python C
base64.encode Baytları Base64 dizesi olarak kodlar.

İmzalar:
base64.encode(bytes) -> string

Örnekler:
base64.encode(b"hello") // "aGVsbG8="
(v0.6.0) (v0.10.0) (v0.2.0) (v0.1.1)
base64.decode Base64 dizesinin kodunu baytlara dönüştürür. Geçersiz girişlerde hata verir.

İmzalar:
base64.decode(string) -> bytes

Örnekler:
base64.decode("aGVsbG8=") // b"hello"
(v0.6.0) (v0.10.0) (v0.2.0) (v0.1.1)
json.encode CEL değerini JSON dizesine dönüştürür.

İmzalar:
json.encode(dyn) -> string

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

Etkinleştirme

Matematik Kitaplığı

İşlev Açıklama Go C++ Java Python C
math.greatest Sayısal bağımsız değişkenlerin (veya sayı listesinin) en büyüğünü döndürür.

İmza:
math.greatest(arg, ...) -> T

Örnekler:
math.greatest(1, 3, 2) // 3
(v0.13.0) (v0.10.0) (v0.2.0) (v0.1.1)
math.least Sayısal bağımsız değişkenlerin (veya sayısal değerler listesinin) en küçüğünü döndürür.

İmza:
math.least(arg, ...) -> T

Örnekler:
math.least([1, 3, 2]) // 1
(v0.13.0) (v0.10.0) (v0.2.0) (v0.1.1)
math.abs Mutlak değer.

İmzalar:
math.abs(T) -> T (int, uint, double desteklenir)<br /><br />**Examples:**<br />math.abs(-1) // 1`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.sqrt Karekök.

İmzalar:
math.sqrt(T) -> double (int, uint, double desteklenir)<br /><br />**Examples:**<br />math.sqrt(9) // 3.0`
(v0.25.1) (v0.12.0) (v0.11.0) (v0.1.1)
math.bitAnd Bit düzeyinde VE.

İmzalar:
math.bitAnd(T, T) -> T (int, uint desteklenir)<br /><br />**Examples:**<br />math.bitAnd(5, 3) // 1`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitOr Bit Tabanlı VEYA.

İmzalar:
math.bitOr(T, T) -> T (int, uint desteklenir)<br /><br />**Examples:**<br />math.bitOr(5, 3) // 7`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitXor Bit düzeyinde XOR.

İmzalar:
math.bitXor(T, T) -> T (int, uint desteklenir)<br /><br />**Examples:**<br />math.bitXor(5, 3) // 6`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitNot Bit düzeyinde DEĞİL.

İmzalar:
math.bitNot(T) -> T (int, uint desteklenir)<br /><br />**Examples:**<br />math.bitNot(1) // -2`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitShiftLeft Bit düzeyinde sola kaydırma.

İmzalar:
math.bitShiftLeft(T, int) -> T (int, uint desteklenir)<br /><br />**Examples:**<br />math.bitShiftLeft(1, 2) // 4`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.bitShiftRight Bit düzeyinde sağa kaydırma.

İmzalar:
math.bitShiftRight(T, int) -> T (int, uint desteklenir)<br /><br />**Examples:**<br />math.bitShiftRight(4, 2) // 1`
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.ceil Yukarı yuvarlama.

İmzalar:
math.ceil(double) -> double

Örnekler:
math.ceil(1.2) // 2.0
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.floor Aşağı yuvarlama.

İmzalar:
math.floor(double) -> double

Örnekler:
math.floor(1.8) // 1.0
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.round En yakın tam sayıya yuvarlama.

İmza:
math.round(double) -> double

Örnekler:
math.round(1.5) // 2.0
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.trunc Kısaltma yuvarlaması (sıfıra doğru).

İmzalar:
math.trunc(double) -> double

Örnekler:
math.trunc(-1.8) // -1.0
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.isInf Çift değerin pozitif veya negatif sonsuz olup olmadığını kontrol eder.

İmza:
math.isInf(double) -> bool

Örnekler:
math.isInf(1.0/0.0) // true
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.isNaN Çift değerin NaN olup olmadığını kontrol eder.

İmzalar:
math.isNaN(double) -> bool

Örnekler:
math.isNaN(0.0/0.0) // true
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.isFinite Çift değerin sonlu olup olmadığını kontrol eder.

İmza:
math.isFinite(double) -> bool

Örnekler:
math.isFinite(1.2) // true
(v0.21.0) (v0.11.0) (v0.10.1) (v0.1.1)
math.sign Değerin işaretini (-1, 0 veya 1) döndürür.

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

Etkinleştirme

Protos Kitaplığı

İşlev Açıklama Go C++ Java Python C
proto.getExt Proto2 uzantı alanını veya ayarlanmamışsa varsayılan değeri alır.

İmzalar:
proto.getExt(msg, extName) -> T

Örnekler:
proto.getExt(msg, google.api.expr.test.int32_ext)
(v0.13.0) (v0.10.0) (v0.2.0) (v0.1.1)
proto.hasExt Proto2 uzantı alanının ayarlanıp ayarlanmadığını kontrol eder.

İmzalar:
proto.hasExt(msg, extName) -> bool

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

Etkinleştirme

  • Git: cel.NewEnv()'a ext.Protos() geçirin.
  • C++: CompilerBuilder öğesine ProtoExtCompilerLibrary() öğesini ekleyin. (Çalışma zamanı otomatik olarak yönetilir.)
  • Java: CelCompiler ve CelRuntime derleyicilerine CelExtensions.protos() ekleyin.
  • Python: cel_expr_python.ext.ext_proto öğesini içe aktarın ve cel.NewEnv(extensions=[...]) içinde ExtProto() öğesini kullanın.

Listeler Kitaplığı

İşlev Açıklama Go C++ Java Python C
distinct Farklı öğeleri döndürür.

İmza:
list.distinct() -> list

Örnekler:
[1, 2, 2].distinct() // [1, 2]
(v0.22.0) (v0.11.0) (v0.11.0) (v0.1.1)
flatten İç içe yerleştirilmiş listeleri düzleştirir.

İmza:
list.flatten([depth]) -> list

Örnekler:
[[1], [2, 3]].flatten() // [1, 2, 3]
(v0.22.0) (v0.11.0) (v0.7.1) (v0.1.1)
lists.range Tam sayı listesi [0, ..., n-1] döndürür.

İmzalar:
lists.range(int) -> list(int)

Örnekler:
lists.range(3) // [0, 1, 2]
(v0.22.0) (v0.11.0) (v0.10.1) (v0.1.1)
reverse Listeyi tersine çevirir.

İmza:
list.reverse() -> list

Örnekler:
[1, 2].reverse() // [2, 1]
(v0.22.0) (v0.11.0) (v0.11.0) (v0.1.1)
slice İade alt listesi (başlangıç dahil, bitiş hariç).

İmza:
list.slice(start, end) -> list

Örnekler:
[1, 2, 3].slice(1, 3) // [2, 3]
(v0.17.0) (v0.11.0) (v0.11.0) (v0.1.1)
sort Karşılaştırılabilir öğelerin listesini sıralar.

İmzalar:
list.sort() -> list

Örnekler:
[3, 1, 2].sort() // [1, 2, 3]
(v0.22.0) (v0.11.0) (v0.11.0) (v0.1.1)
sortBy Listeyi, ifadeden değerlendirilen anahtara göre sıralar.

İmzalar:
list.sortBy(var, expr) -> list

Örnekler:
[{"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 İlk öğeyi isteğe bağlı olarak döndürür. İsteğe bağlı uzantı gerekir.

İmzalar:
list.first() -> optional

Örnekler:
[1, 2].first() // optional(1)
(v0.23.0) (v0.15.0) (v0.11.0) (v0.1.2)
last Son öğeyi isteğe bağlı olarak döndürür. İsteğe bağlı uzantı gerekir.

İmzalar:
list.last() -> optional

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

Etkinleştirme

Set Kitaplığı

İşlev Açıklama Go C++ Java Python C
sets.contains Liste1'in, liste2'deki tüm öğeleri içerip içermediğini kontrol eder.

İmza:
sets.contains(list1, list2) -> bool

Örnekler:
sets.contains([1, 2], [1]) // true
(v0.15.0) (v0.10.0) (v0.6.0) (v0.1.1)
sets.equivalent Listelerin küme eşdeğeri olup olmadığını (aynı benzersiz öğeleri içerip içermediğini) kontrol eder.

İmza:
sets.equivalent(list1, list2) -> bool

Örnekler:
sets.equivalent([1, 2], [2, 1, 1]) // true
(v0.15.0) (v0.10.0) (v0.6.0) (v0.1.1)
sets.intersects Listelerin en az bir öğeyi paylaşıp paylaşmadığını kontrol eder.

İmza:
sets.intersects(list1, list2) -> bool

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

Etkinleştirme

  • Git: cel.NewEnv()'a ext.Sets() geçirin.
  • C++:
  • Java: CelCompiler ve CelRuntime derleyicilerine CelExtensions.sets() ekleyin.
  • Python: cel.EnvConfig üzerinden etkinleştirmek için extensions listesine sets ekleyin.

Dizeler Kitaplığı

İşlev Açıklama Go C++ Java Python C
charAt Dizindeki karakteri döndürür.

İmza:
string.charAt(int) -> string

Örnekler:
"hello".charAt(1) // "e"
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
indexOf Alt dizenin ilk geçtiği yerin dizinini veya -1'i döndürür.

İmza:
string.indexOf(substr, [start]) -> int

Örnekler:
"hello".indexOf("l") // 2
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
lastIndexOf Alt dizenin son oluşumunun dizinini veya -1'i döndürür.

İmzalar:
string.lastIndexOf(substr, [end]) -> int

Örnekler:
"hello".lastIndexOf("l") // 3
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
join Dizeleri birleştirir.

İmzalar:
list(string).join([separator]) -> string

Örnekler:
["a", "b"].join("-") // "a-b"
(v0.10.0) (v0.10.0) (v0.2.0) (v0.1.1)
split Dizeyi ayırıcıya göre böler.

İmzalar:
string.split(separator, [limit]) -> list(string)

Örnekler:
"a-b".split("-") // ["a", "b"]
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
substring Alt dizeyi döndürür (başlangıç dahil, bitiş hariç).

İmza:
string.substring(start, [end]) -> string

Örnekler:
"hello".substring(1, 3) // "el"
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
trim Unicode boşluklarını kırpar.

İmzalar:
string.trim() -> string

Örnekler:
" hello ".trim() // "hello"
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
replace Eski değerleri yeni değerlerle değiştirir.

İmza:
string.replace(old, new, [limit]) -> string

Örnekler:
"hello".replace("l", "w") // "hewwo"
(v0.4.0) (v0.10.0) (v0.2.0) (v0.1.1)
reverse Unicode kod noktalarını tersine çevirir.

İmzalar:
string.reverse() -> string

Örnekler:
"abc".reverse() // "cba"
(v0.18.0) (v0.14.0) (v0.13.0) (v0.1.1)
lowerAscii ASCII karakterleri küçük harfe dönüştürür.

İmzalar:
string.lowerAscii() -> string

Örnekler:
"Hello".lowerAscii() // "hello"
(v0.6.0) (v0.11.0) (v0.2.0) (v0.1.1)
upperAscii ASCII karakterleri büyük harfe dönüştürür.

İmza:
string.upperAscii() -> string

Örnekler:
"Hello".upperAscii() // "HELLO"
(v0.6.0) (v0.11.0) (v0.2.0) (v0.1.1)
quote Güvenli yazdırma için dizeden kaçar.

İmzalar:
strings.quote(string) -> string

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

Etkinleştirme

Normal İfade Kitaplığı

İşlev Açıklama Go C++ Java Python C
regex.replace Eşleşmeleri değiştirme dizesiyle değiştirir (geri referansları destekler).

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

Örnekler:
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 Kalıbın ilk eşleşmesini döndürür (bir yakalama grubu olmalıdır).

İmza:
regex.extract(target, pat) -> optional(string)

Örnekler:
regex.extract("a123b", r"(\d+)") // optional("123")
(v0.25.1) (v0.13.0) (v0.10.1) (v0.1.1)
regex.extractAll Kalıbın tüm eşleşmelerini döndürür (bir yakalama grubu olmalıdır).

İmza:
regex.extractAll(target, pat) -> list(string)

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

Etkinleştirme

İki Değişkenli Anlama

Makro Açıklama Go C++ Java Python C
all Anahtar/dizin ve değer üzerinde kısa devre mantıksal VE.

İmzalar:
list.all(i, v, pred) -> bool
map.all(k, v, pred) -> bool

Örnekler:
[1, 2].all(i, v, v > 0) // true
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
exists Anahtar/dizin ve değer üzerinde mantıksal VEYA'yı kısa devre yapma.

İmzalar:
list.exists(i, v, pred) -> bool
map.exists(k, v, pred) -> bool

Örnekler:
[1, 2].exists(i, v, v == 2) // true
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
existsOne Tam olarak bir çiftin yüklemi karşılayıp karşılamadığını kontrol eder.

İmzalar:
list.existsOne(i, v, pred) -> bool
map.existsOne(k, v, pred) -> bool

Örnekler:
[1, 2].existsOne(i, v, v == 2) // true
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
transformList Listeyi/haritayı listeye dönüştürür/filtreler.

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

Örnekler:
[1, 2].transformList(i, v, v * 2) // [2, 4]
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
transformMap Liste/harita değerlerini haritaya dönüştürür (anahtarlar sabit kalır).

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

Örnekler:
[1, 2].transformMap(i, v, v * 2) // {0: 2, 1: 4}
(v0.22.0) (v0.14.0) (v0.11.0) (v0.1.1)
transformMapEntry Haritaya dönüşür.

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

Örnekler:
[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)

Etkinleştirme

Yerel Türler Kitaplığı

Özellik Açıklama Go C++ Java Python C
Yerel Yapılar Ana makine yerel türlerini (Go yapıları / Java POJO'ları) CEL'de kaydetme ve örnekleme.

Örnekler:
Account{id: 123} (CEL'de örneklenen Java POJO'su)
(v0.13.0) (v0.13.0)

Etkinleştirme

  • Git: ext.NativeTypes(...) (yansıtma türleri sağlama) cel.NewEnv()'a iletin.
  • C++: Desteklenmez.
  • Java: CelCompiler ve CelRuntime oluşturucularına CelExtensions.nativeTypes() (Java sınıfları sağlayan) öğesini ekleyin.
  • Python: Desteklenmez.

Ağ Kitaplığı

Ağ kitaplığı, IP adreslerini ve CIDR bloklarını ayrıştırma, doğrulama ve işleme işlevleri sağlar.

İşlev Açıklama Go C++ Java Python C
ip Bir dizeyi IP adresine ayrıştırır veya bir CIDR'den IP'yi çıkarır.

İmzalar:
ip(string) -> IP
CIDR.ip() -> IP

Örnekler:
ip("192.168.0.1")
cidr("192.168.0.0/24").ip()
(v0.29.0)
isIP Bir dizenin geçerli bir IP adresi olup olmadığını kontrol eder.

İmza:
isIP(string) -> bool

Örnekler:
isIP("192.168.0.1") // true
(v0.29.0)
ip.isCanonical Bir IP adresi dizesinin kanonik biçimde olup olmadığını kontrol eder.

İmza:
ip.isCanonical(string) -> bool

Örnekler:
ip.isCanonical("192.168.0.1") // true
(v0.29.0)
cidr Bir dizeyi CIDR bloğuna ayrıştırır.

İmzalar:
cidr(string) -> CIDR

Örnekler:
cidr("192.168.0.0/24")
(v0.29.0)
isCIDR Bir dizenin geçerli bir CIDR bloğu olup olmadığını kontrol eder.

İmza:
isCIDR(string) -> bool

Örnekler:
isCIDR("192.168.0.0/24") // true
(v0.29.0)
containsIP Bir CIDR bloğunun IP adresi içerip içermediğini kontrol eder.

İmzalar:
CIDR.containsIP(IP) -> bool
CIDR.containsIP(string) -> bool

Örnekler:
cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true
(v0.29.0)
containsCIDR Bir CIDR bloğunun başka bir CIDR bloğu içerip içermediğini kontrol eder.

İmza:
CIDR.containsCIDR(CIDR) -> bool
CIDR.containsCIDR(string) -> bool

Örnekler:
cidr("192.168.0.0/16").containsCIDR(cidr("192.168.1.0/24")) // true
(v0.29.0)
family IP ailesini (IPv4 için 4, IPv6 için 6) döndürür.

İmza:
IP.family() -> int

Örnekler:
ip("192.168.0.1").family() // 4
(v0.29.0)
isGlobalUnicast IP'nin genel tek yayın adresi olup olmadığını kontrol eder.

İmzalar:
IP.isGlobalUnicast() -> bool

Örnekler:
ip("192.168.0.1").isGlobalUnicast() // true
(v0.29.0)
isLinkLocalMulticast IP'nin yerel bağlantı çoklu yayın adresi olup olmadığını kontrol eder.

İmzalar:
IP.isLinkLocalMulticast() -> bool

Örnekler:
ip("224.0.0.1").isLinkLocalMulticast() // true
(v0.29.0)
isLinkLocalUnicast IP'nin bağlantı yerel tek noktaya yayın adresi olup olmadığını kontrol eder.

İmzalar:
IP.isLinkLocalUnicast() -> bool

Örnekler:
ip("169.254.0.1").isLinkLocalUnicast() // true
(v0.29.0)
isLoopback IP'nin geri döngü adresi olup olmadığını kontrol eder.

İmzalar:
IP.isLoopback() -> bool

Örnekler:
ip("127.0.0.1").isLoopback() // true
(v0.29.0)
isMask CIDR'nin geçerli bir alt ağ maskesi olup olmadığını kontrol eder.

İmzalar:
CIDR.isMask() -> bool

Örnekler:
cidr("255.255.255.0/24").isMask() // true
(v0.29.0)
isUnspecified IP'nin belirtilmemiş bir adres olup olmadığını kontrol eder (ör. 0.0.0.0).

İmzalar:
IP.isUnspecified() -> bool

Örnekler:
ip("0.0.0.0").isUnspecified() // true
(v0.29.0)
masked Maskelenmiş CIDR bloğunu döndürür.

İmza:
CIDR.masked() -> CIDR

Örnekler:
cidr("192.168.0.1/24").masked() // 192.168.0.0/24
(v0.29.0)
prefixLength CIDR bloğunun önek uzunluğunu döndürür.

İmza:
CIDR.prefixLength() -> int

Örnekler:
cidr("192.168.0.0/24").prefixLength() // 24
(v0.29.0)
string IP veya CIDR'yi dizeye dönüştürür.

İmzalar:
string(IP) -> string
string(CIDR) -> string

Örnekler:
string(ip("192.168.0.1")) // "192.168.0.1"
(v0.29.0)

Etkinleştirme

  • Git: cel.NewEnv()'a ext.Network() geçirin.
  • C++: Desteklenmez.
  • Java: Desteklenmez.
  • Python: Desteklenmez.

5. İleri Seviye Özellikler

İleri Seviye Özellikler Özeti

Özellik Açıklama Go C++ Java Python C
Kısmi Değerlendirme Eksik girişlerle değerlendirme; bilinmeyenleri veya basitleştirilmiş bir ifadeyi döndürür. ³
Eş zamansız değerlendirme Uzantı işlevlerinin eşzamanlı olarak engellenmeden yürütülmesi.
AST Doğrulayıcıları Tür kontrolünden sonra Checked AST üzerinde statik analiz kontrolleri.
AST Optimizasyonları Performansı artırmak için AST yeniden yazma (sabit katlama, satır içi, CSE)
CEL Policy Compiler YAML tabanlı politika yapılarını standart CEL AST'lerine derler.

³ Go, Residual AST (budanmış AST) oluşturmayı destekler. ⁴ C++ ve Java, çalışma zamanında UnknownSet / CelUnknownSet döndürmeyi destekler ancak kalan AST oluşturma için herkese açık API'ler sunmaz. ⁵ Go, AsyncBinding / AsyncOp geri dönen kanalları kullanır. ⁶ Java, CelAsyncRuntime döndürmek için ListenableFuture kullanır.

Kısmi Değerlendirme (Bilinmeyenler)

Kısmi değerlendirme, yalnızca giriş değişkenlerinin (bağımsız değişkenler) bir alt kümesi bilindiğinde bir ifadenin değerlendirilmesine olanak tanır. Değerlendirme başarısız olmak yerine neyin eksik olduğunu gösteren bir sonuç veya basitleştirilmiş bir ifade üretir.

  • Go: Tam desteklenir. Bilinmeyen özelliklerin kalıplarıyla PartialActivation tanımlamaya olanak tanır. Değerlendirme, types.Unknown değeri döndürüyor. Go, yalnızca değerlendirilemeyen ifadenin bölümlerini içeren, budanmış ve basitleştirilmiş bir Residual AST (Env.ResidualAst) oluşturmayı destekler.
  • C++: Unknown değerlerini destekler. Bilinmeyen özellik kalıpları Activation::set_unknown_attribute_patterns üzerinden yapılandırılır. Değerlendirme UnknownSet döndürür. Genel API şu anda artık AST oluşturmayı kullanıma sunmamaktadır.
  • Java: PartialVars passed to Program.eval() aracılığıyla kısmi değerlendirmeyi destekler. Değerlendirme CelUnknownSet döndürür. Genel API, şu anda kalan AST oluşturmayı kullanıma sunmamaktadır.
  • Python / C: Yerel destek yoktur.

Eşzamansız Değerlendirme

Asenkron değerlendirme, CEL ifadelerinin asenkron olarak yürütülen işlevleri (ör.RPC'ler veya veritabanı sorguları oluşturma) çağırmasına ve sonuçlar kullanılabilir hale gelene kadar değerlendirmeyi engellemesine olanak tanır. Bu sırada ana yürütme iş parçacığı engellenmez.

  • Go: AsyncBinding ve AsyncOp aracılığıyla eşzamansız işlev aşırı yüklemelerini destekler. Eşzamansız işlevler bir Go kanalı (<-chan ref.Val) döndürür ve yorumlayıcı, eşzamanlı yürütme ve senkronizasyonu yönetir.
  • Java: CelAsyncRuntime ve AsyncProgram üzerinden asenkron değerlendirmeyi destekler. Bekleyen değerleri temsil etmek için ListenableFuture simgesini kullanır ve vadeli işlemler çözüldükçe değerlendirmeyi otomatik olarak tamamlar.
  • C++ / Python / C: Yerleşik destek yoktur.

AST Doğrulayıcıları

Doğrulayıcılar, program yürütülmeden önce alana özgü kısıtlamaları zorunlu kılmak için tür denetiminden sonra Checked AST üzerinde statik analiz gerçekleştirir.

  • Go: ASTValidator arayüzünü destekler. Standart doğrulayıcılar arasında cel.validator.duration, cel.validator.timestamp, cel.validator.matches (normal ifade), cel.validator.homogeneous_literals ve cel.validator.comprehension_nesting_limit bulunur.
  • C++: cel::Validator desteklenir. Standartlaştırma doğrulamaları arasında AstDepthValidator, ComprehensionNestingLimitValidator, DurationLiteralValidator, HomogeneousLiteralValidator, MatchesValidator ve TimestampLiteralValidator bulunur.
  • Java: CelValidator ve CelAstValidator desteklenir. Standart doğrulayıcılar arasında AstDepthLimitValidator, ComprehensionNestingLimitValidator, DurationLiteralValidator, HomogeneousLiteralValidator, RegexLiteralValidator ve TimestampLiteralValidator yer alır.
  • Python / C: Doğrudan desteklenmez.

AST Optimizasyonları

Optimizasyon araçları, yürütme performansını artırmak için AST'yi yeniden yazar. Optimizasyon araçları, statik ve çalışma zamanı optimizasyon araçları olmak üzere iki kategoride yer alır. C++, Java ve Go, çalışma zamanı optimizasyonunu destekler. CEL Java ve Go, statik optimize edicileri de destekler. Tipik optimizasyonlar arasında sabit katlama (sabit girişlerle alt ifadeleri önceden değerlendirme) ve ortak alt ifadeyi ortadan kaldırma (CSE) bulunur.

  • Go: Derleme/planlama sırasında AST katlamayı destekler.
  • C++: Planlama sırasında cel::extensions::EnableConstantFolding uzantısı aracılığıyla sabit katlamayı destekler.
  • Java: CelOptimizer arayüzünü destekler. Kanonik optimizasyonlar arasında ConstantFoldingOptimizer (kısa devre dallarını kısmi değerlendirmeyi simüle ederek katlayabilir), InliningOptimizer ve SubexpressionOptimizer (CSE) bulunur.
  • Python / C: Doğrudan desteklenmez.

CEL Policy Compiler

CEL politikası, değişkenler, eşleşme blokları, koşullu çıkışlar ve iç içe kurallarla birlikte birden fazla CEL ifadesini oluşturmak için kullanılan YAML tabanlı bir biçimdir. Tek CEL ifadelerinin okunamaz hale geleceği karmaşık politika motorları (ör. Kubernetes Kabul Kontrolü) için tasarlanmıştır.

Politika derleyicisi, bu YAML politikalarını tek bir standart CEL AST'ye derler. Bu da politikaların standart CEL çalışma zamanlarıyla tamamen uyumlu olduğu ve tüm performans ve güvenlik garantilerini devraldığı anlamına gelir.

  • Go: third_party/cel/go/policy üzerinden desteklenir.
  • C++: third_party/cel/cpp/policy üzerinden desteklenir.
  • Java: third_party/java/cel/policy üzerinden desteklenir.
  • Python / C: Doğrudan desteklenmez.