مرجع واجهة برمجة التطبيقات للغة التعبير الشائعة (CEL)

يعمل هذا المستند كمرجع موحّد لمستندات واجهة برمجة التطبيقات الخاصة بلغة التعبير الشائعة (CEL). تعرض هذه الصفحة جميع وحدات الماكرو والمعاملات والدوال العادية، مع توضيح تواقيعها وسلوكياتها وحالة توفّرها في جميع حِزم CEL الرسمية.

لمزيد من التفاصيل حول سلوك اللغة ومواصفاتها، يُرجى الرجوع إلى تعريف لغة CEL.

إصدارات الحزمة

يستند هذا المستند المرجعي إلى الإصدارات التالية من حِزم CEL:

  • CEL Go: الإصدار v0.29.2 (والإصدارات الأحدث)
  • CEL C++‎: v0.15.0
  • CEL Java: v0.13.1
  • ‫CEL Python: v0.1.3
  • CEL C: لقطة تطوير (لم يتم إصدارها)

مرايا GitHub

يتم عرض عمليات التنفيذ الرسمية للغة CEL على GitHub ضمن مؤسسة cel-expr:


1. وحدات الماكرو الأساسية

هذه وحدات ماكرو مضمّنة يتم توسيعها في وقت الترجمة البرمجية.

وحدة الماكرو الوصف Go C++‎ جافا Python C
has(container.field) تختبر هذه الدالة ما إذا كان حقل معيّن متوفّرًا في رسالة أو مفتاح في خريطة.

التوقيعات:
has(container.field) -> bool

أمثلة:
has(request.auth.claims.email)
list.all(var, predicate) تختبر هذه الدالة ما إذا كانت جميع العناصر في القائمة تستوفي شرطًا معيّنًا.

التوقيعات:
list.all(var, predicate) -> bool

أمثلة:
[1, 2, 3].all(x, x > 0) // true
¹
list.exists(var, predicate) تختبر هذه الدالة ما إذا كان عنصر واحد على الأقل في القائمة يستوفي شرطًا.

التوقيعات:
list.exists(var, predicate) -> bool

أمثلة:
[1, 2, 3].exists(x, x > 2) // true
¹
list.exists_one(var, predicate) تختبر ما إذا كان عنصر واحد فقط في القائمة يستوفي شرطًا.

التوقيعات:
list.exists_one(var, predicate) -> bool

أمثلة:
[1, 2, 3].exists_one(x, x == 2) // true
¹
list.filter(var, predicate) تفلتر هذه الدالة عناصر القائمة وفقًا لدالة منطقية.

التوقيعات:
list.filter(var, predicate) -> list

أمثلة:
[1, 2, 3].filter(x, x > 1) // [2, 3]
¹
list.map(var, transform) تحوّل كل عنصر في القائمة باستخدام تعبير.

التوقيعات:
list.map(var, transform) -> list

أمثلة:
[1, 2, 3].map(x, x * 2) // [2, 4, 6]
¹
list.map(var, filter, transform) تحويل عناصر القائمة التي تستوفي شرط الفلتر.

التوقيعات:
list.map(var, filter, transform) -> list

أمثلة:
[1, 2, 3].map(x, x > 1, x * 2) // [4, 6]
¹

¹ يتم توفير الدعم في وقت تشغيل C لأنّه يتم توسيع وحدات الماكرو إلى عبارات أثناء التجميع بواسطة المجمّع المضيف.


2. عوامل التشغيل الأساسية

عامل التشغيل الوصف Go C++‎ جافا Python C
الحساب (+، -، *، /، %) عمليات حسابية عادية النفي (-x) والهوية (+x). يمكن دمج القوائم (list + list) في Go وC++‎ وJava وPython.

التواقيع:
T + T -> T
T - T -> T
T * T -> T
T / T -> T
T % T -> T
-T -> T
+T -> T
list + list -> list

أمثلة:
1 + 2 * 3 // 7
[1] + [2] // [1, 2]
²
المقارنة (==، !=، <، <=، >، >=) المقارنة العادية تكون المقارنات الرقمية غير متجانسة (مثل 1 == 1.0).

التوقيعات:
T == T -> bool
T != T -> bool
T < T -> bool
T <= T -> bool
T > T -> bool
T >= T -> bool

أمثلة:
x < 42.0
1 == 1.0 // true
المنطقية (!، &&، ||، ? :) Logical NOT وAND وOR وTernary Conditional استخدِم التقييم المختصر.

التواقيع:
!bool -> bool
bool && bool -> bool
bool || bool -> bool
bool ? T : T -> T

أمثلة:
x > 0 ? "positive" : "non-positive"
الفهرسة ([]) الوصول إلى عنصر في قائمة حسب الفهرس أو مفتاح البحث في خريطة

التوقيعات:
list[int] -> T
map[K] -> V

أمثلة:
tags[0]
users['john']
الاشتراك (in) للتحقّق مما إذا كان العنصر في قائمة أو المفتاح في خريطة

التوقيعات:
T in list -> bool
K in map -> bool

أمثلة:
'admin' in roles

² لا تتوافق عملية ربط القوائم (list + list) مع وقت تشغيل C، على الرغم من أنّ عوامل التشغيل الحسابية الأخرى متوافقة.


3- الوظائف الأساسية

الدوال العامة ودوال السلاسل

الوظيفة الوصف Go C++‎ جافا Python C
size تعرض هذه الدالة حجم سلسلة (أحرف) أو وحدات بايت أو قائمة أو خريطة.

التواقيع:
size(T) -> int (حيث T هي string أو bytes أو list أو map)<br /><br />**Examples:**<br />size("hello") // 5`
contains تعرض هذه الدالة ما إذا كانت السلسلة تحتوي على سلسلة فرعية.

التوقيعات:
string.contains(string) -> bool

أمثلة:
"hello".contains("ell") // true
startsWith تعرِض ما إذا كانت السلسلة تبدأ بالبادئة.

التواقيع:
string.startsWith(string) -> bool

أمثلة:
"hello".startsWith("he") // true
endsWith تعرِض ما إذا كانت السلسلة تنتهي باللاحقة.

التواقيع:
string.endsWith(string) -> bool

أمثلة:
"hello".endsWith("lo") // true
matches تعرض هذه الدالة ما إذا كانت السلسلة تطابق التعبير العادي RE2.

التوقيعات:
string.matches(string) -> bool

أمثلة:
"123".matches(r"^\d+$") // true

وظائف أداة اختيار التاريخ والوقت

تستخرج هذه الدوال مكوّنات من google.protobuf.Timestamp أو google.protobuf.Duration.

الوظيفة الوصف Go C++‎ جافا Python C
getFullYear تعرض هذه الدالة السنة المكوّنة من 4 أرقام.

التوقيعات:
timestamp.getFullYear([tz]) -> int

أمثلة:
timestamp("2026-07-23T00:00:00Z").getFullYear() // 2026
getMonth تعرض هذه الدالة الشهر (من 0 إلى 11).

التوقيعات:
timestamp.getMonth([tz]) -> int

أمثلة:
timestamp("2026-07-23T00:00:00Z").getMonth() // 6
getDayOfMonth تعرض هذه الدالة اليوم من الشهر (من 1 إلى 31).

التوقيعات:
timestamp.getDayOfMonth([tz]) -> int

أمثلة:
timestamp("2026-07-23T00:00:00Z").getDayOfMonth() // 23
getDayOfWeek تعرض هذه الدالة اليوم من الأسبوع (0 = الأحد).

التوقيعات:
timestamp.getDayOfWeek([tz]) -> int

أمثلة:
timestamp("2026-07-23T00:00:00Z").getDayOfWeek() // 4
getDayOfYear تعرض هذه الدالة اليوم من السنة (من 0 إلى 365).

التوقيعات:
timestamp.getDayOfYear([tz]) -> int

أمثلة:
timestamp("2026-07-23T00:00:00Z").getDayOfYear() // 203
getHours تعرض هذه الدالة الساعات (من 0 إلى 23).

التوقيعات:
timestamp.getHours([tz]) -> int
duration.getHours() -> int

أمثلة:
duration("1h30m").getHours() // 1
getMinutes تعرض هذه الدالة الدقائق (من 0 إلى 59).

التوقيعات:
timestamp.getMinutes([tz]) -> int
duration.getMinutes() -> int

أمثلة:
duration("1h30m").getMinutes() // 30
getSeconds تعرِض هذه الدالة الثواني (من 0 إلى 59).

التوقيعات:
timestamp.getSeconds([tz]) -> int
duration.getSeconds() -> int

أمثلة:
duration("1h30m45s").getSeconds() // 45
getMilliseconds تعرض هذه الدالة قيمة الملّي ثانية (من 0 إلى 999).

التوقيعات:
timestamp.getMilliseconds([tz]) -> int
duration.getMilliseconds() -> int

أمثلة:
duration("1.5s").getMilliseconds() // 500

تحويل الأنواع

نوع الاستهداف الوصف Go C++‎ جافا Python C
bool تحويل إلى قيمة منطقية

التوقيعات:
bool(bool) -> bool
bool(string) -> bool

أمثلة:
bool("true") // true
bytes تحويل إلى وحدات بايت

التوقيعات:
bytes(bytes) -> bytes
bytes(string) -> bytes

أمثلة:
bytes("hello") // b"hello"
double تحويل إلى عدد فاصل عائم للدقة المزدوجة

التواقيع:
double(double) -> double
double(int) -> double
double(uint) -> double
double(string) -> double

أمثلة:
double(1) // 1.0
duration تحويل إلى مدة

التوقيعات:
duration(duration) -> duration
duration(string) -> duration

أمثلة:
duration("1.5s") // 1.5s duration
int تحويل إلى عدد صحيح بعلامة 64 بت

التوقيعات:
int(int) -> int
int(uint) -> int
int(double) -> int (يتم التقريب إلى صفر)
int(string) -> int
int(timestamp) -> int (الثواني منذ بداية الحقبة)

أمثلة:
int(1.5) // 1
string يتم التحويل إلى سلسلة.

التواقيع:
string(T) -> string (يتوافق مع bool وint وuint وdouble وbytes وtimestamp وduration)<br /><br />**Examples:**<br />string(1.5) // "1.5"`
timestamp تحويل إلى طابع زمني

التوقيعات:
timestamp(timestamp) -> timestamp
timestamp(string) -> timestamp (RFC3339)

أمثلة:
timestamp("2026-07-23T00:00:00Z")
uint تحويل إلى عدد صحيح غير موقّع 64 بت

التواقيع:
uint(uint) -> uint
uint(int) -> uint
uint(double) -> uint
uint(string) -> uint

أمثلة:
uint(1) // 1u
dyn تحويل القيمة إلى نوع ديناميكي للتحقّق من النوع

التوقيعات:
dyn(T) -> dyn

أمثلة:
dyn([1, "two"])
type تعرض هذه الدالة نوع القيمة.

التوقيعات:
type(T) -> type

أمثلة:
type(1) // int

4. الإضافات (المكتبات)

مكتبة الروابط

الوظيفة الوصف Go C++‎ جافا Python C
cel.bind يربط هذا الإجراء متغيّرًا محليًا لتجنُّب التقييم المكرّر.

التوقيعات:
cel.bind(varName, initExpr, resultExpr) -> T

أمثلة:
cel.bind(x, a + b, x * x)
(الإصدار 0.15.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)

كيفية التفعيل

  • القيمة: مرِّر القيمة ext.Bindings() إلى cel.NewEnv().
  • ‫C++: أضِف BindingsCompilerLibrary() إلى CompilerBuilder. (تتم معالجة وقت التشغيل تلقائيًا).
  • Java: أضِف CelExtensions.bindings() إلى CelCompiler وCelRuntime.
  • Python: استورِد cel_expr_python.ext.ext_bindings واستخدِم ExtBindings() في cel.NewEnv(extensions=[...]).

مكتبة برامج الترميز

الوظيفة الوصف Go C++‎ جافا Python C
base64.encode ترميز وحدات البايت إلى سلسلة base64

التواقيع:
base64.encode(bytes) -> string

أمثلة:
base64.encode(b"hello") // "aGVsbG8="
(الإصدار 0.6.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
base64.decode يفك ترميز سلسلة base64 إلى وحدات بايت. يُظهر هذا الإجراء خطأً عند إدخال بيانات غير صالحة.

التوقيعات:
base64.decode(string) -> bytes

أمثلة:
base64.decode("aGVsbG8=") // b"hello"
(الإصدار 0.6.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
json.encode تحوّل قيمة CEL إلى سلسلة JSON.

التوقيعات:
json.encode(dyn) -> string

أمثلة:
json.encode([1, 2]) // "[1,2]"
(الإصدار 0.29.0)

كيفية التفعيل

مكتبة الرياضيات

الوظيفة الوصف Go C++‎ جافا Python C
math.greatest تعرض هذه الدالة أكبر قيمة من الوسيطات الرقمية (أو قائمة الأرقام).

التوقيعات:
math.greatest(arg, ...) -> T

أمثلة:
math.greatest(1, 3, 2) // 3
(الإصدار 0.13.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
math.least تعرض هذه الدالة أصغر الوسيطات الرقمية (أو قائمة الأرقام).

التوقيعات:
math.least(arg, ...) -> T

أمثلة:
math.least([1, 3, 2]) // 1
(الإصدار 0.13.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
math.abs القيمة المطلقة.

التوقيعات:
math.abs(T) -> T (يتوافق مع int وuint وdouble)<br /><br />**Examples:**<br />math.abs(-1) // 1`
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.sqrt الجذر التربيعي.

التواقيع:
math.sqrt(T) -> double (تتيح int وuint وdouble)<br /><br />**Examples:**<br />math.sqrt(9) // 3.0`
(الإصدار 0.25.1) (الإصدار 0.12.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
math.bitAnd عملية AND الثنائية

التوقيعات:
math.bitAnd(T, T) -> T (تتيح int وuint)<br /><br />**Examples:**<br />math.bitAnd(5, 3) // 1`
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.bitOr استخدام OR على مستوى البت.

التوقيعات:
math.bitOr(T, T) -> T (يتوافق مع int وuint)<br /><br />**Examples:**<br />math.bitOr(5, 3) // 7`
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.bitXor عملية XOR على مستوى البتات

التوقيعات:
math.bitXor(T, T) -> T (متوافق مع int وuint)<br /><br />**Examples:**<br />math.bitXor(5, 3) // 6`
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.bitNot استخدام NOT على مستوى البت

التوقيعات:
math.bitNot(T) -> T (يتوافق مع int وuint)<br /><br />**Examples:**<br />math.bitNot(1) // -2`
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.bitShiftLeft إزاحة بتية إلى اليسار

التواقيع:
math.bitShiftLeft(T, int) -> T (متوافق مع int وuint)<br /><br />**Examples:**<br />math.bitShiftLeft(1, 2) // 4`
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.bitShiftRight إزاحة بتية إلى اليمين

التوقيعات:
math.bitShiftRight(T, int) -> T (تتوافق مع int وuint)<br /><br />**Examples:**<br />math.bitShiftRight(4, 2) // 1`
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.ceil تقريب السقف

التواقيع:
math.ceil(double) -> double

أمثلة:
math.ceil(1.2) // 2.0
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.floor التقريب إلى أقرب عدد صحيح أصغر

التوقيعات:
math.floor(double) -> double

أمثلة:
math.floor(1.8) // 1.0
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.round التقريب إلى أقرب عدد صحيح

التوقيعات:
math.round(double) -> double

أمثلة:
math.round(1.5) // 2.0
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.trunc التقريب إلى أقرب عدد صحيح (باتجاه الصفر).

التوقيعات:
math.trunc(double) -> double

أمثلة:
math.trunc(-1.8) // -1.0
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.isInf للتحقّق ممّا إذا كانت القيمة المضاعفة موجبة أو سالبة.

التوقيعات:
math.isInf(double) -> bool

أمثلة:
math.isInf(1.0/0.0) // true
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.isNaN تتحقّق هذه الدالة ممّا إذا كانت القيمة المزدوجة NaN.

التوقيعات:
math.isNaN(double) -> bool

أمثلة:
math.isNaN(0.0/0.0) // true
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.isFinite تتحقّق هذه الدالة مما إذا كان الرقم المزدوج محدودًا.

التوقيعات:
math.isFinite(double) -> bool

أمثلة:
math.isFinite(1.2) // true
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
math.sign تعرض هذه الدالة إشارة القيمة (-1 أو 0 أو 1).

التواقيع:
math.sign(T) -> T (تتوافق مع int وuint وdouble)<br /><br />**Examples:**<br />math.sign(-42) // -1`
(الإصدار 0.21.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)

كيفية التفعيل

  • القيمة: مرِّر القيمة ext.Math() إلى cel.NewEnv().
  • C++:
  • Java: أضِف CelExtensions.math() إلى أدوات إنشاء CelCompiler وCelRuntime.
  • Python: استورِد cel_expr_python.ext.ext_math واستخدِم ExtMath() في cel.NewEnv(extensions=[...]).

Protos Library

الوظيفة الوصف Go C++‎ جافا Python C
proto.getExt يحصل على حقل إضافة proto2 أو القيمة التلقائية إذا لم يتم ضبطه.

التوقيعات:
proto.getExt(msg, extName) -> T

أمثلة:
proto.getExt(msg, google.api.expr.test.int32_ext)
(الإصدار 0.13.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
proto.hasExt تتحقّق هذه الدالة مما إذا تم ضبط حقل إضافة proto2.

التوقيعات:
proto.hasExt(msg, extName) -> bool

أمثلة:
proto.hasExt(msg, google.api.expr.test.int32_ext)
(الإصدار 0.13.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)

كيفية التفعيل

  • القيمة: مرِّر القيمة ext.Protos() إلى cel.NewEnv().
  • C++‎: أضِف ProtoExtCompilerLibrary() إلى CompilerBuilder. (تتم معالجة وقت التشغيل تلقائيًا).
  • Java: أضِف CelExtensions.protos() إلى أدوات إنشاء CelCompiler وCelRuntime.
  • Python: استورِد cel_expr_python.ext.ext_proto واستخدِم ExtProto() في cel.NewEnv(extensions=[...]).

مكتبة القوائم

الوظيفة الوصف Go C++‎ جافا Python C
distinct تعرض هذه الدالة عناصر مميزة.

التوقيعات:
list.distinct() -> list

أمثلة:
[1, 2, 2].distinct() // [1, 2]
(الإصدار 0.22.0) (الإصدار 0.11.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
flatten تعمل هذه الدالة على تسوية القوائم المتداخلة.

التوقيعات:
list.flatten([depth]) -> list

أمثلة:
[[1], [2, 3]].flatten() // [1, 2, 3]
(الإصدار 0.22.0) (الإصدار 0.11.0) (الإصدار 0.7.1) (الإصدار 0.1.1)
lists.range تعرض هذه الدالة قائمة بالأعداد الصحيحة [0, ..., n-1].

التوقيعات:
lists.range(int) -> list(int)

أمثلة:
lists.range(3) // [0, 1, 2]
(الإصدار 0.22.0) (الإصدار 0.11.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
reverse تعكس ترتيب القائمة.

التوقيعات:
list.reverse() -> list

أمثلة:
[1, 2].reverse() // [2, 1]
(الإصدار 0.22.0) (الإصدار 0.11.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
slice تعرض هذه السمة قائمة فرعية من المرتجعات (تتضمّن بداية النطاق ولا تتضمّن نهايته).

التوقيعات:
list.slice(start, end) -> list

أمثلة:
[1, 2, 3].slice(1, 3) // [2, 3]
(الإصدار 0.17.0) (الإصدار 0.11.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
sort ترتّب هذه السمة قائمة العناصر القابلة للمقارنة.

التوقيعات:
list.sort() -> list

أمثلة:
[3, 1, 2].sort() // [1, 2, 3]
(الإصدار 0.22.0) (الإصدار 0.11.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
sortBy ترتّب القائمة حسب المفتاح الذي تم تقييمه من التعبير.

التوقيعات:
list.sortBy(var, expr) -> list

أمثلة:
[{"val": 2}, {"val": 1}].sortBy(x, x.val) // [{"val": 1}, {"val": 2}]
(الإصدار 0.22.0) (الإصدار 0.11.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
first تعرض هذه السمة العنصر الأول كعنصر اختياري. يتطلّب هذا الخيار إضافة Optional.

التواقيع:
list.first() -> optional

أمثلة:
[1, 2].first() // optional(1)
(الإصدار 0.23.0) (الإصدار 0.15.0) (الإصدار 0.11.0) (الإصدار 0.1.2)
last تعرض هذه السمة العنصر الأخير كعنصر اختياري. يتطلّب هذا الخيار إضافة Optional.

التواقيع:
list.last() -> optional

أمثلة:
[1, 2].last() // optional(2)
(الإصدار 0.23.0) (الإصدار 0.15.0) (الإصدار 0.11.0) (الإصدار 0.1.2)

كيفية التفعيل

  • القيمة: مرِّر القيمة ext.Lists() إلى cel.NewEnv().
  • C++:
  • Java: أضِف CelExtensions.lists() إلى أدوات إنشاء CelCompiler وCelRuntime.
  • Python: فعِّل هذه الميزة من خلال cel.EnvConfig عن طريق إضافة lists إلى قائمة extensions.

مكتبة المجموعات

الوظيفة الوصف Go C++‎ جافا Python C
sets.contains تتحقّق هذه الدالة ممّا إذا كانت list1 تحتوي على جميع عناصر list2.

التوقيعات:
sets.contains(list1, list2) -> bool

أمثلة:
sets.contains([1, 2], [1]) // true
(الإصدار 0.15.0) (الإصدار 0.10.0) (الإصدار 0.6.0) (الإصدار 0.1.1)
sets.equivalent تتحقّق هذه الدالة مما إذا كانت القوائم متطابقة (أي تحتوي على العناصر الفريدة نفسها).

التوقيعات:
sets.equivalent(list1, list2) -> bool

أمثلة:
sets.equivalent([1, 2], [2, 1, 1]) // true
(الإصدار 0.15.0) (الإصدار 0.10.0) (الإصدار 0.6.0) (الإصدار 0.1.1)
sets.intersects تتحقّق هذه الدالة ممّا إذا كانت القوائم تتضمّن عنصرًا واحدًا على الأقل.

التوقيعات:
sets.intersects(list1, list2) -> bool

أمثلة:
sets.intersects([1, 2], [2, 3]) // true
(الإصدار 0.15.0) (الإصدار 0.10.0) (الإصدار 0.6.0) (الإصدار 0.1.1)

كيفية التفعيل

  • القيمة: مرِّر القيمة ext.Sets() إلى cel.NewEnv().
  • C++:
  • Java: أضِف CelExtensions.sets() إلى أدوات إنشاء CelCompiler وCelRuntime.
  • Python: فعِّل هذه الميزة من خلال cel.EnvConfig عن طريق إضافة sets إلى قائمة extensions.

مكتبة السلاسل

الوظيفة الوصف Go C++‎ جافا Python C
charAt تعرض هذه الدالة الحرف في الفهرس.

التوقيعات:
string.charAt(int) -> string

أمثلة:
"hello".charAt(1) // "e"
(الإصدار 0.4.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
indexOf تعرض هذه الدالة فهرس أول تكرار للسلسلة الفرعية، أو القيمة -1.

التوقيعات:
string.indexOf(substr, [start]) -> int

أمثلة:
"hello".indexOf("l") // 2
(الإصدار 0.4.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
lastIndexOf تعرض هذه الدالة فهرس آخر تكرار للسلسلة الفرعية، أو القيمة -1.

التواقيع:
string.lastIndexOf(substr, [end]) -> int

أمثلة:
"hello".lastIndexOf("l") // 3
(الإصدار 0.4.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
join تدمج السلاسل.

التوقيعات:
list(string).join([separator]) -> string

أمثلة:
["a", "b"].join("-") // "a-b"
(الإصدار 0.10.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
split تقسيم السلسلة حسب الفاصل

التوقيعات:
string.split(separator, [limit]) -> list(string)

أمثلة:
"a-b".split("-") // ["a", "b"]
(الإصدار 0.4.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
substring تعرض هذه الدالة السلسلة الفرعية (بداية شاملة ونهاية غير شاملة).

التوقيعات:
string.substring(start, [end]) -> string

أمثلة:
"hello".substring(1, 3) // "el"
(الإصدار 0.4.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
trim تزيل هذه الدالة المسافات البيضاء في Unicode.

التوقيعات:
string.trim() -> string

أمثلة:
" hello ".trim() // "hello"
(الإصدار 0.4.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
replace يستبدل هذا الإجراء القيم القديمة بالقيم الجديدة.

التوقيعات:
string.replace(old, new, [limit]) -> string

أمثلة:
"hello".replace("l", "w") // "hewwo"
(الإصدار 0.4.0) (الإصدار 0.10.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
reverse تعكس نقاط رموز Unicode.

التوقيعات:
string.reverse() -> string

أمثلة:
"abc".reverse() // "cba"
(الإصدار 0.18.0) (الإصدار 0.14.0) (الإصدار 0.13.0) (الإصدار 0.1.1)
lowerAscii تحويل أحرف ASCII إلى أحرف صغيرة

التوقيعات:
string.lowerAscii() -> string

أمثلة:
"Hello".lowerAscii() // "hello"
(الإصدار 0.6.0) (الإصدار 0.11.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
upperAscii تحويل أحرف ASCII إلى أحرف كبيرة

التواقيع:
string.upperAscii() -> string

أمثلة:
"Hello".upperAscii() // "HELLO"
(الإصدار 0.6.0) (الإصدار 0.11.0) (الإصدار 0.2.0) (الإصدار 0.1.1)
quote تُستخدَم هذه الدالة لتجنُّب أي مشاكل عند طباعة السلسلة.

التوقيعات:
strings.quote(string) -> string

أمثلة:
strings.quote("a\tb") // "\"a\\tb\""
(الإصدار 0.14.0) (الإصدار 0.14.0) (الإصدار 0.13.0) (الإصدار 0.1.1)

كيفية التفعيل

مكتبة التعبيرات العادية

الوظيفة الوصف Go C++‎ جافا Python C
regex.replace يستبدل التطابقات بسلسلة الاستبدال (يتيح المراجع الخلفية).

التوقيعات:
regex.replace(target, pat, repl, [limit]) -> string

أمثلة:
regex.replace("123-456", r"(\d+)-(\d+)", r"\2-\1") // "456-123"
(الإصدار 0.25.1) (الإصدار 0.13.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
regex.extract عرض أول تطابق للنمط (يجب أن يتضمّن مجموعة التقاط واحدة)

التوقيعات:
regex.extract(target, pat) -> optional(string)

أمثلة:
regex.extract("a123b", r"(\d+)") // optional("123")
(الإصدار 0.25.1) (الإصدار 0.13.0) (الإصدار 0.10.1) (الإصدار 0.1.1)
regex.extractAll تعرِض هذه الدالة جميع المطابقات للنمط (يجب أن تتضمّن مجموعة التقاط واحدة).

التوقيعات:
regex.extractAll(target, pat) -> list(string)

أمثلة:
regex.extractAll("a1b2", r"(\d+)") // ["1", "2"]
(الإصدار 0.25.1) (الإصدار 0.13.0) (الإصدار 0.10.1) (الإصدار 0.1.1)

كيفية التفعيل

  • القيمة: مرِّر القيمة ext.Regex() إلى cel.NewEnv().
  • C++:
  • Java: أضِف CelExtensions.regex() إلى أدوات إنشاء CelCompiler وCelRuntime.
  • Python: فعِّل هذه الميزة من خلال cel.EnvConfig عن طريق إضافة regex وoptional إلى قائمة extensions.

Two-Variable Comprehensions

وحدة الماكرو الوصف Go C++‎ جافا Python C
all اختصار عملية الربط المنطقي AND على المفتاح/الفهرس والقيمة

التوقيعات:
list.all(i, v, pred) -> bool
map.all(k, v, pred) -> bool

أمثلة:
[1, 2].all(i, v, v > 0) // true
(الإصدار 0.22.0) (الإصدار 0.14.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
exists اختصار منطق "أو" على المفتاح/الفهرس والقيمة

التوقيعات:
list.exists(i, v, pred) -> bool
map.exists(k, v, pred) -> bool

أمثلة:
[1, 2].exists(i, v, v == 2) // true
(الإصدار 0.22.0) (الإصدار 0.14.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
existsOne للتحقّق ممّا إذا كان هناك زوج واحد فقط يستوفي المسند.

التوقيعات:
list.existsOne(i, v, pred) -> bool
map.existsOne(k, v, pred) -> bool

أمثلة:
[1, 2].existsOne(i, v, v == 2) // true
(الإصدار 0.22.0) (الإصدار 0.14.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
transformList تحويل/فلترة القائمة/الخريطة إلى قائمة

التواقيع:
list.transformList(i, v, [filter], transform) -> list
map.transformList(k, v, [filter], transform) -> list

أمثلة:
[1, 2].transformList(i, v, v * 2) // [2, 4]
(الإصدار 0.22.0) (الإصدار 0.14.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
transformMap تحويل قيم القائمة أو الخريطة إلى خريطة (تبقى المفاتيح ثابتة).

التوقيعات:
list.transformMap(i, v, [filter], transform) -> map
map.transformMap(k, v, [filter], transform) -> map

أمثلة:
[1, 2].transformMap(i, v, v * 2) // {0: 2, 1: 4}
(الإصدار 0.22.0) (الإصدار 0.14.0) (الإصدار 0.11.0) (الإصدار 0.1.1)
transformMapEntry يتحوّل إلى خريطة.

التوقيعات:
list.transformMapEntry(i, v, [filter], transform_entry) -> map
map.transformMapEntry(k, v, [filter], transform_entry) -> map

أمثلة:
[1, 2].transformMapEntry(i, v, {string(v): v * 2}) // {"1": 2, "2": 4}
(الإصدار 0.22.0) (الإصدار 0.14.0) (الإصدار 0.11.0) (الإصدار 0.1.1)

كيفية التفعيل

مكتبة الأنواع الأصلية

الميزة الوصف Go C++‎ جافا Python C
Native Structs تسجيل أنواع أصلية للمضيف وإنشاؤها (بنى Go / كائنات Java POJO) في CEL

أمثلة:
Account{id: 123} (كائن Java POJO تم إنشاؤه في CEL)
(الإصدار 0.13.0) (الإصدار 0.13.0)

كيفية التفعيل

  • القيمة: تمرير ext.NativeTypes(...) (توفير أنواع الانعكاس) إلى cel.NewEnv().
  • C++: غير متوافق.
  • Java: أضِف CelExtensions.nativeTypes() (الذي يوفّر فئات Java) إلى أدوات الإنشاء CelCompiler وCelRuntime.
  • Python: غير متاح.

مكتبة الشبكة

توفّر مكتبة الشبكة دوالاً لتحليل عناوين IP وكتل CIDR والتحقّق من صحتها ومعالجتها.

الوظيفة الوصف Go C++‎ جافا Python C
ip تحلّل هذه الدالة سلسلة إلى عنوان IP، أو تستخرج عنوان IP من CIDR.

التوقيعات:
ip(string) -> IP
CIDR.ip() -> IP

أمثلة:
ip("192.168.0.1")
cidr("192.168.0.0/24").ip()
(الإصدار 0.29.0)
isIP للتحقّق مما إذا كانت السلسلة تمثّل عنوان IP صالحًا.

التوقيعات:
isIP(string) -> bool

أمثلة:
isIP("192.168.0.1") // true
(الإصدار 0.29.0)
ip.isCanonical للتحقّق مما إذا كانت سلسلة عنوان IP بالتنسيق الأساسي.

التوقيعات:
ip.isCanonical(string) -> bool

أمثلة:
ip.isCanonical("192.168.0.1") // true
(الإصدار 0.29.0)
cidr تحلّل هذه الدالة سلسلة إلى حظر CIDR.

التواقيع:
cidr(string) -> CIDR

أمثلة:
cidr("192.168.0.0/24")
(الإصدار 0.29.0)
isCIDR للتحقّق مما إذا كانت السلسلة عبارة عن مجموعة CIDR صالحة.

التوقيعات:
isCIDR(string) -> bool

أمثلة:
isCIDR("192.168.0.0/24") // true
(الإصدار 0.29.0)
containsIP للتحقّق مما إذا كان حظر CIDR يتضمّن عنوان IP.

التواقيع:
CIDR.containsIP(IP) -> bool
CIDR.containsIP(string) -> bool

أمثلة:
cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true
(الإصدار 0.29.0)
containsCIDR تتحقّق هذه الدالة ممّا إذا كانت إحدى كتل CIDR تتضمّن كتلة CIDR أخرى.

التوقيعات:
CIDR.containsCIDR(CIDR) -> bool
CIDR.containsCIDR(string) -> bool

أمثلة:
cidr("192.168.0.0/16").containsCIDR(cidr("192.168.1.0/24")) // true
(الإصدار 0.29.0)
family تعرِض هذه السمة عائلة عناوين IP (4 لـ IPv4 و6 لـ IPv6).

التوقيعات:
IP.family() -> int

أمثلة:
ip("192.168.0.1").family() // 4
(الإصدار 0.29.0)
isGlobalUnicast للتحقّق مما إذا كان عنوان IP هو عنوان أحادي البث عالمي.

التوقيعات:
IP.isGlobalUnicast() -> bool

أمثلة:
ip("192.168.0.1").isGlobalUnicast() // true
(الإصدار 0.29.0)
isLinkLocalMulticast للتحقّق ممّا إذا كان عنوان IP هو عنوان بث متعدّد محلي للرابط.

التوقيعات:
IP.isLinkLocalMulticast() -> bool

أمثلة:
ip("224.0.0.1").isLinkLocalMulticast() // true
(الإصدار 0.29.0)
isLinkLocalUnicast تتحقّق هذه الدالة مما إذا كان عنوان IP هو عنوان أحادي البث محلي الارتباط.

التوقيعات:
IP.isLinkLocalUnicast() -> bool

أمثلة:
ip("169.254.0.1").isLinkLocalUnicast() // true
(الإصدار 0.29.0)
isLoopback تتحقّق هذه الدالة مما إذا كان عنوان IP هو عنوان إعادة توجيه.

التوقيعات:
IP.isLoopback() -> bool

أمثلة:
ip("127.0.0.1").isLoopback() // true
(الإصدار 0.29.0)
isMask تتحقّق هذه الدالة مما إذا كان CIDR قناع شبكة فرعية صالحًا.

التوقيعات:
CIDR.isMask() -> bool

أمثلة:
cidr("255.255.255.0/24").isMask() // true
(الإصدار 0.29.0)
isUnspecified تتحقّق هذه السمة مما إذا كان عنوان IP هو عنوان غير محدّد (مثل 0.0.0.0).

التوقيعات:
IP.isUnspecified() -> bool

أمثلة:
ip("0.0.0.0").isUnspecified() // true
(الإصدار 0.29.0)
masked تعرِض هذه الدالة كتلة CIDR المخفية.

التوقيعات:
CIDR.masked() -> CIDR

أمثلة:
cidr("192.168.0.1/24").masked() // 192.168.0.0/24
(الإصدار 0.29.0)
prefixLength تعرض هذه السمة طول بادئة حظر CIDR.

التنسيقات:
CIDR.prefixLength() -> int

أمثلة:
cidr("192.168.0.0/24").prefixLength() // 24
(الإصدار 0.29.0)
string تحويل عنوان IP أو CIDR إلى سلسلة

التواقيع:
string(IP) -> string
string(CIDR) -> string

أمثلة:
string(ip("192.168.0.1")) // "192.168.0.1"
(الإصدار 0.29.0)

كيفية التفعيل

  • القيمة: مرِّر القيمة ext.Network() إلى cel.NewEnv().
  • C++: غير متوافق.
  • Java: غير متاح.
  • Python: غير متاح.

5- الميزات المتقدّمة

ملخّص الميزات المتقدّمة

الميزة الوصف Go C++‎ جافا Python C
التقييم الجزئي التقييم باستخدام مدخلات غير متوفّرة، ويتم عرض قيم غير معروفة أو تعبير مبسط. ³
التقييم غير المتزامن التنفيذ المتزامن غير الحظر لوظائف الإضافة
أدوات التحقّق من صحة AST تُجري عملية التحليل الثابت عمليات التحقّق من Checked AST بعد التحقّق من النوع.
أدوات تحسين AST إعادة كتابة شجرة بناء الجملة المجردة (مثل طيّ الثوابت، والتضمين، والتعبير الفرعي المشترك) لتحسين الأداء
أداة تجميع سياسات CEL تجميع بنى السياسات المستندة إلى YAML في أشجار بنية مجردة (AST) عادية للغة CEL

³ تتيح لغة Go إنشاء شجرة بناء مجردة متبقية (شجرة بناء مجردة تم تقليل حجمها). ⁴ تتيح لغتا C++‎ وJava عرض UnknownSet / CelUnknownSet في وقت التشغيل، ولكنّهما لا توفّران واجهات برمجة تطبيقات عامة لإنشاء شجرة بنية مجردة متبقية. ⁵ تستخدم Go AsyncBinding / AsyncOp في عرض قنوات البث. ⁶ تستخدم Java CelAsyncRuntime لعرض ListenableFuture.

التقييم الجزئي (القيم غير المعروفة)

تتيح التقييم الجزئي تقييم تعبير عندما تكون مجموعة فرعية فقط من متغيرات الإدخال (المَعلمات) معروفة. بدلاً من أن تفشل عملية التقييم، فإنّها تنتج نتيجة تشير إلى ما هو مفقود، أو تعبير مبسط.

  • Go: متوافقة تمامًا. تسمح هذه السمة بتحديد PartialActivation باستخدام أنماط السمات غير المعروفة. يُرجع التقييم قيمة types.Unknown. تتيح Go إنشاء شجرة بناء الجملة المجردة المتبقية (Env.ResidualAst) وهي شجرة بناء جملة مجردة مبسطة ومحذوف منها بعض العناصر، ولا تحتوي إلا على أجزاء التعبير التي لم يكن من الممكن تقييمها.
  • C++‎: تتيح استخدام قيم Unknown. يتم ضبط أنماط السمات غير المعروفة من خلال Activation::set_unknown_attribute_patterns. تعرض عملية التقييم UnknownSet. لا تعرض واجهة برمجة التطبيقات العامة حاليًا إنشاء AST المتبقّي.
  • Java: تتيح التقييم الجزئي من خلال PartialVars الذي تم تمريره إلى Program.eval(). تعرض عملية التقييم CelUnknownSet. لا تعرض واجهة برمجة التطبيقات العامة حاليًا ميزة إنشاء شجرة بنية تجريدية متبقية.
  • Python / C: لا تتوفّر إمكانية استخدامها بشكلٍ أصلي.

التقييم غير المتزامن

تسمح عملية التقييم غير المتزامن لتعبيرات CEL باستدعاء دوال يتم تنفيذها بشكل غير متزامن (مثل إجراء طلبات استدعاء الإجراء عن بُعد أو طلبات بحث في قاعدة البيانات) وحظر عملية التقييم إلى أن تتوفّر النتائج، وذلك بدون حظر سلسلة التنفيذ الرئيسية.

  • Go: تتيح استخدام دوال غير متزامنة عبر AsyncBinding وAsyncOp. تعرض الدوال غير المتزامنة قناة Go (<-chan ref.Val)، ويتولّى المفسّر إدارة التنفيذ المتزامن والمزامنة.
  • Java: تتيح التقييم غير المتزامن من خلال CelAsyncRuntime وAsyncProgram. تستخدِم هذه السمة ListenableFuture لتمثيل القيم المعلّقة وتؤدي تلقائيًا إلى إكمال التقييم عند حلّ القيم المستقبلية.
  • C++‎ / Python / C: لا تتوفّر ميزة مدمجة.

أدوات التحقّق من صحة AST

تُجري أدوات التحقّق تحليلًا ثابتًا على شجرة بنية مجرّدة (AST) تم التحقّق منها بعد التحقّق من النوع لفرض قيود خاصة بالمجال قبل تنفيذ البرنامج.

  • Go: يتوافق مع واجهة ASTValidator. تشمل أدوات التحقّق من صحة البيانات الأساسية ما يلي: cel.validator.duration وcel.validator.timestamp وcel.validator.matches (تعبير عادي) وcel.validator.homogeneous_literals وcel.validator.comprehension_nesting_limit.
  • C++‎: تتوافق مع cel::Validator. تشمل عمليات التحقّق من صحة الروابط الأساسية ما يلي: AstDepthValidator وComprehensionNestingLimitValidator وDurationLiteralValidator وHomogeneousLiteralValidator وMatchesValidator وTimestampLiteralValidator.
  • Java: تتوافق مع CelValidator وCelAstValidator. تشمل أدوات التحقّق من صحة الروابط الأساسية AstDepthLimitValidator وComprehensionNestingLimitValidator وDurationLiteralValidator وHomogeneousLiteralValidator وRegexLiteralValidator وTimestampLiteralValidator.
  • Python / C: لا تتوفّر إمكانية الربط المباشر.

أدوات تحسين AST

تعيد أدوات التحسين كتابة شجرة بنية التجريد لتحسين أداء التنفيذ. تنقسم أدوات التحسين إلى فئتين: أدوات التحسين الثابتة وأدوات التحسين أثناء وقت التشغيل. تتيح لغات C++‎ وJava وGo تحسين الأداء في وقت التشغيل. تتوافق لغتا CEL Java وGo أيضًا مع أدوات التحسين الثابتة. تشمل التحسينات النموذجية طيّ الثوابت (التقييم المسبق للتعبيرات الفرعية باستخدام المدخلات الثابتة) وإزالة التعبيرات الفرعية المشتركة (CSE).

  • Go: تتيح طي شجرة بنية التجريد أثناء التجميع/التخطيط.
  • ++C: تتيح تقليل الثوابت من خلال الإضافة cel::extensions::EnableConstantFolding في وقت التخطيط.
  • Java: تتوافق مع واجهة CelOptimizer. تشمل أدوات التحسين الأساسية ConstantFoldingOptimizer (التي يمكنها طيّ الفروع ذات الدائرة القصيرة من خلال محاكاة التقييم الجزئي) وInliningOptimizer وSubexpressionOptimizer (إزالة التعبيرات الفرعية المشتركة).
  • Python / C: لا تتوفّر إمكانية الربط المباشر.

أداة تجميع سياسات CEL

سياسة CEL هي تنسيق مستند إلى YAML لإنشاء تعبيرات CEL متعددة معًا، بالإضافة إلى متغيرات وكتل مطابقة ومخرجات شرطية وقواعد متداخلة. وهي مصمَّمة لمحركات السياسات المعقّدة (مثل Kubernetes Admission Control) التي تصبح فيها تعبيرات CEL الفردية غير قابلة للقراءة.

يجمع &quot;مجمّع السياسات&quot; سياسات YAML هذه في شجرة بنية مجردة (AST) واحدة متوافقة مع CEL، ما يعني أنّها متوافقة تمامًا مع أوقات تشغيل CEL العادية وتتضمّن جميع ضمانات الأداء والسلامة.

  • الخطوة: يتم توفير الدعم من خلال third_party/cel/go/policy.
  • C++‎: يتم توفير الدعم من خلال third_party/cel/cpp/policy.
  • Java: يتم توفير الدعم من خلال third_party/java/cel/policy.
  • Python / C: غير متوافقَين مباشرةً.