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 -> TT - T -> TT * T -> TT / T -> TT % T -> T-T -> T+T -> Tlist + 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 -> boolT != T -> boolT < T -> boolT <= T -> boolT > T -> boolT >= T -> boolÖrnekler: x < 42.01 == 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 -> boolbool && bool -> boolbool || bool -> boolbool ? 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] -> Tmap[K] -> VÖrnekler: tags[0]users['john'] |
✓ | ✓ | ✓ | ✓ | ✓ |
Üyelik (in) |
Öğenin listede veya anahtarın haritada olup olmadığını kontrol edin. İmzalar: T in list -> boolK 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]) -> intduration.getHours() -> intÖrnekler: duration("1h30m").getHours() // 1 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMinutes |
Dakikayı (0-59) döndürür. İmza: timestamp.getMinutes([tz]) -> intduration.getMinutes() -> intÖrnekler: duration("1h30m").getMinutes() // 30 |
✓ | ✓ | ✓ | ✓ | ✗ |
getSeconds |
Saniyeyi (0-59) döndürür. İmzalar: timestamp.getSeconds([tz]) -> intduration.getSeconds() -> intÖrnekler: duration("1h30m45s").getSeconds() // 45 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMilliseconds |
Milisaniyeleri (0-999) döndürür. İmzalar: timestamp.getMilliseconds([tz]) -> intduration.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) -> boolbool(string) -> boolÖrnekler: bool("true") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
bytes |
Bayta dönüştürür. İmza: bytes(bytes) -> bytesbytes(string) -> bytesÖrnekler: bytes("hello") // b"hello" |
✓ | ✓ | ✓ | ✓ | ✓ |
double |
Çift duyarlıklı kayan nokta biçimine dönüştürür. İmzalar: double(double) -> doubledouble(int) -> doubledouble(uint) -> doubledouble(string) -> doubleÖrnekler: double(1) // 1.0 |
✓ | ✓ | ✓ | ✓ | ✓ |
duration |
Süreye dönüştürür. İmza: duration(duration) -> durationduration(string) -> durationÖrnekler: duration("1.5s") // 1.5s duration |
✓ | ✓ | ✓ | ✓ | ✓ |
int |
64 bit imzalı tam sayıya dönüştürür. İmzalar: int(int) -> intint(uint) -> intint(double) -> int (sıfıra yuvarlar)int(string) -> intint(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) -> timestamptimestamp(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) -> uintuint(int) -> uintuint(double) -> uintuint(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()'aext.Bindings()geçirin. - C++:
CompilerBuilderöğesineBindingsCompilerLibrary()ekleyin. (Çalışma zamanı otomatik olarak yönetilir.) - Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.bindings()ekleyin. - Python:
cel_expr_python.ext.ext_bindingsöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtBindings()öğ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
- Git:
cel.NewEnv()'aext.Encoders()geçirin. - C++:
- Derleyici:
EncodersCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterEncodersFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.encoders()ekleyin. - Python:
cel_expr_python.ext.ext_encodersöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtEncoders()öğesini kullanın.
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
- Git:
cel.NewEnv()'aext.Math()geçirin. - C++:
- Derleyici:
MathCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterMathExtensionFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.math()ekleyin. - Python:
cel_expr_python.ext.ext_mathöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtMath()öğesini kullanın.
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()'aext.Protos()geçirin. - C++:
CompilerBuilderöğesineProtoExtCompilerLibrary()öğesini ekleyin. (Çalışma zamanı otomatik olarak yönetilir.) - Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.protos()ekleyin. - Python:
cel_expr_python.ext.ext_protoöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtProto()öğ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
- Git:
cel.NewEnv()'aext.Lists()geçirin. - C++:
- Derleyici:
ListsCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistryüzerindeRegisterListsFunctions()veMacroRegistryüzerindeRegisterListsMacros()işlevini çağırın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.lists()ekleyin. - Python:
cel.EnvConfigüzerinden etkinleştirmek içinextensionslistesinelistsekleyin.
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()'aext.Sets()geçirin. - C++:
- Derleyici:
SetsCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterSetsFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.sets()ekleyin. - Python:
cel.EnvConfigüzerinden etkinleştirmek içinextensionslistesinesetsekleyin.
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
- Git:
cel.NewEnv()'aext.Strings()geçirin. - C++:
- Derleyici:
StringsCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterStringsFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.strings()ekleyin. - Python:
cel_expr_python.ext.ext_stringsöğesini içe aktarın vecel.NewEnv(extensions=[...])içindeExtStrings()öğesini kullanın.
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
- Git:
cel.NewEnv()'aext.Regex()geçirin. - C++:
- Derleyici:
RegexExtCompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistrytarihindeRegisterRegexExtensionFunctions()numaralı telefonu arayın.
- Derleyici:
- Java:
CelCompilerveCelRuntimederleyicilerineCelExtensions.regex()ekleyin. - Python:
cel.EnvConfigaracılığıyla etkinleştirmek içinregexveoptionalöğeleriniextensionslistesine ekleyin.
İ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) -> boolmap.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) -> boolmap.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) -> boolmap.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) -> listmap.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) -> mapmap.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) -> mapmap.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
- Git:
cel.NewEnv()'aext.TwoVarComprehensions()geçirin. - C++:
- Derleyici:
ComprehensionsV2CompilerLibrary()öğesiniCompilerBuilderöğesine ekleyin. - Çalışma zamanı:
FunctionRegistryüzerindeRegisterComprehensionsV2Functions()veMacroRegistryüzerindeRegisterComprehensionsV2Macros()çağrısı yapın.
- Derleyici:
- Java:
CelExtensions.comprehensions()öğesiniCelCompilerveCelRuntimeoluşturucularına ekleyin. - Python:
cel.EnvConfigüzerinden etkinleştirmek içintwo-var-comprehensionsöğesiniextensionslistesine ekleyin.
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:
CelCompilerveCelRuntimeoluşturucularınaCelExtensions.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) -> IPCIDR.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) -> boolCIDR.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) -> boolCIDR.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) -> stringstring(CIDR) -> stringÖrnekler: string(ip("192.168.0.1")) // "192.168.0.1" |
✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
Etkinleştirme
- Git:
cel.NewEnv()'aext.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
PartialActivationtanımlamaya olanak tanır. Değerlendirme,types.Unknowndeğ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++:
Unknowndeğerlerini destekler. Bilinmeyen özellik kalıplarıActivation::set_unknown_attribute_patternsüzerinden yapılandırılır. DeğerlendirmeUnknownSetdöndürür. Genel API şu anda artık AST oluşturmayı kullanıma sunmamaktadır. - Java:
PartialVarspassed toProgram.eval()aracılığıyla kısmi değerlendirmeyi destekler. DeğerlendirmeCelUnknownSetdö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:
AsyncBindingveAsyncOparacı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:
CelAsyncRuntimeveAsyncProgramüzerinden asenkron değerlendirmeyi destekler. Bekleyen değerleri temsil etmek içinListenableFuturesimgesini 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:
ASTValidatorarayüzünü destekler. Standart doğrulayıcılar arasındacel.validator.duration,cel.validator.timestamp,cel.validator.matches(normal ifade),cel.validator.homogeneous_literalsvecel.validator.comprehension_nesting_limitbulunur. - C++:
cel::Validatordesteklenir. Standartlaştırma doğrulamaları arasındaAstDepthValidator,ComprehensionNestingLimitValidator,DurationLiteralValidator,HomogeneousLiteralValidator,MatchesValidatorveTimestampLiteralValidatorbulunur. - Java:
CelValidatorveCelAstValidatordesteklenir. Standart doğrulayıcılar arasındaAstDepthLimitValidator,ComprehensionNestingLimitValidator,DurationLiteralValidator,HomogeneousLiteralValidator,RegexLiteralValidatorveTimestampLiteralValidatoryer 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::EnableConstantFoldinguzantısı aracılığıyla sabit katlamayı destekler. - Java:
CelOptimizerarayüzünü destekler. Kanonik optimizasyonlar arasındaConstantFoldingOptimizer(kısa devre dallarını kısmi değerlendirmeyi simüle ederek katlayabilir),InliningOptimizerveSubexpressionOptimizer(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.