এই ডকুমেন্টটি কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL)-এর জন্য একটি সমন্বিত এপিআই ডক রেফারেন্স হিসেবে কাজ করে। এতে অফিসিয়াল CEL স্ট্যাক জুড়ে সমস্ত ম্যাক্রো, অপারেটর এবং স্ট্যান্ডার্ড ফাংশনগুলোর সিগনেচার, আচরণ এবং সাপোর্ট স্ট্যাটাস উল্লেখ করা হয়েছে।
ভাষার আচরণ ও নির্দিষ্টকরণ সম্পর্কে আরও বিশদ তথ্যের জন্য, CEL ভাষার সংজ্ঞা দেখুন।
স্ট্যাক সংস্করণ
এই রেফারেন্স ডকুমেন্টটি CEL স্ট্যাকের নিম্নলিখিত সংস্করণগুলির উপর ভিত্তি করে তৈরি:
- CEL Go :
v0.29.2(এবং নতুন সংস্করণ) - সেল সি++ :
v0.15.0 - সিইএল জাভা :
v0.13.1 - CEL পাইথন :
v0.1.3 - সিইএল সি : উন্নয়ন স্ন্যাপশট (অপ্রকাশিত)
গিটহাব মিরর
CEL-এর আনুষ্ঠানিক বাস্তবায়নগুলো গিটহাবে cel-expr অর্গানাইজেশনের অধীনে মিরর করা আছে:
১. মূল ম্যাক্রো
এগুলো হলো অন্তর্নির্মিত ম্যাক্রো যা কম্পাইল করার সময় সম্প্রসারিত হয়।
| ম্যাক্রো | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
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] | ✓ | ✓ | ✓ | ✓ | ✓ ¹ |
¹ সি রানটাইমে সমর্থিত, কারণ হোস্ট কম্পাইলার দ্বারা কম্পাইলেশনের সময় ম্যাক্রোগুলো কম্প্রিহেনশনে প্রসারিত হয়।
২. মূল অপারেটররা
| অপারেটর | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
পাটিগণিত ( + , - , * , / , % ) | সাধারণ গাণিতিক প্রক্রিয়া। নেগেশন ( -x ) এবং আইডেন্টিটি ( +x )। লিস্ট কনক্যাটেনেশন ( list + list ) Go, C++, Java, এবং Python-এ সমর্থিত।স্বাক্ষরসমূহ: T + T -> TT - T -> TT * T -> TT / T -> TT % T -> T-T -> T+T -> Tlist + list -> listউদাহরণ: 1 + 2 * 3 // 7[1] + [2] // [1, 2] | ✓ | ✓ | ✓ | ✓ | ✓ ² |
তুলনা ( == , != , < , <= , > , >= ) | সাধারণ তুলনা। সংখ্যাসূচক তুলনাগুলো ভিন্নধর্মী হয় (যেমন 1 == 1.0 )।স্বাক্ষরসমূহ: T == T -> boolT != T -> boolT < T -> boolT <= T -> boolT > T -> boolT >= T -> boolউদাহরণ: x < 42.01 == 1.0 // true | ✓ | ✓ | ✓ | ✓ | ✓ |
যৌক্তিক ( ! , && , || , ? : :) | লজিক্যাল NOT, AND, OR, এবং টারনারি কন্ডিশনাল। AND/OR শর্ট-সার্কিট ইভ্যালুয়েশন ব্যবহার করে। স্বাক্ষরসমূহ: !bool -> boolbool && bool -> boolbool || bool -> boolbool ? T : T -> Tউদাহরণ: x > 0 ? "positive" : "non-positive" | ✓ | ✓ | ✓ | ✓ | ✓ |
সূচীকরণ ( [] ) | ইনডেক্স ব্যবহার করে লিস্টের এলিমেন্ট অ্যাক্সেস করুন, অথবা ম্যাপে লুকআপ কী ব্যবহার করুন। স্বাক্ষরসমূহ: list[int] -> Tmap[K] -> Vউদাহরণ: tags[0]users['john'] | ✓ | ✓ | ✓ | ✓ | ✓ |
সদস্যপদ ( in ) | এলিমেন্টটি কোনো লিস্টে আছে কিনা, অথবা কী-টি কোনো ম্যাপে আছে কিনা তা যাচাই করুন। স্বাক্ষরসমূহ: T in list -> boolK in map -> boolউদাহরণ: 'admin' in roles | ✓ | ✓ | ✓ | ✓ | ✓ |
² সি রানটাইমে লিস্ট সংযোজন ( list + list ) সমর্থিত নয় , যদিও অন্যান্য গাণিতিক অপারেটর সমর্থিত।
৩. মূল কার্যাবলী
সাধারণ ও স্ট্রিং ফাংশন
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
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 থেকে উপাদানগুলো নিষ্কাশন করে।
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
getFullYear | চার-অঙ্কের বছরটি ফেরত দেয়। স্বাক্ষরসমূহ: timestamp.getFullYear([tz]) -> intউদাহরণ: timestamp("2026-07-23T00:00:00Z").getFullYear() // 2026 | ✓ | ✓ | ✓ | ✓ | ✗ |
getMonth | মাসটি (০-১১) ফেরত দেয়। স্বাক্ষরসমূহ: timestamp.getMonth([tz]) -> intউদাহরণ: timestamp("2026-07-23T00:00:00Z").getMonth() // 6 | ✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfMonth | মাসের দিনটি (১-৩১) দেখায়। স্বাক্ষরসমূহ: timestamp.getDayOfMonth([tz]) -> intউদাহরণ: timestamp("2026-07-23T00:00:00Z").getDayOfMonth() // 23 | ✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfWeek | সপ্তাহের দিনটি জানায় (০ = রবিবার)। স্বাক্ষরসমূহ: timestamp.getDayOfWeek([tz]) -> intউদাহরণ: timestamp("2026-07-23T00:00:00Z").getDayOfWeek() // 4 | ✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfYear | বছরের দিনটি (০-৩৬৫) জানায়। স্বাক্ষরসমূহ: timestamp.getDayOfYear([tz]) -> intউদাহরণ: timestamp("2026-07-23T00:00:00Z").getDayOfYear() // 203 | ✓ | ✓ | ✓ | ✓ | ✗ |
getHours | ঘন্টা (০-২৩) ফেরত দেয়। স্বাক্ষরসমূহ: timestamp.getHours([tz]) -> intduration.getHours() -> intউদাহরণ: duration("1h30m").getHours() // 1 | ✓ | ✓ | ✓ | ✓ | ✗ |
getMinutes | মিনিট (০-৫৯) ফেরত দেয়। স্বাক্ষরসমূহ: timestamp.getMinutes([tz]) -> intduration.getMinutes() -> intউদাহরণ: duration("1h30m").getMinutes() // 30 | ✓ | ✓ | ✓ | ✓ | ✗ |
getSeconds | সেকেন্ডে (০-৫৯) ফেরত দেয়। স্বাক্ষরসমূহ: timestamp.getSeconds([tz]) -> intduration.getSeconds() -> intউদাহরণ: duration("1h30m45s").getSeconds() // 45 | ✓ | ✓ | ✓ | ✓ | ✗ |
getMilliseconds | মিলিসেকেন্ডে (০-৯৯৯) ফেরত দেয়। স্বাক্ষরসমূহ: timestamp.getMilliseconds([tz]) -> intduration.getMilliseconds() -> intউদাহরণ: duration("1.5s").getMilliseconds() // 500 | ✓ | ✓ | ✓ | ✓ | ✗ |
টাইপ রূপান্তর
| লক্ষ্য প্রকার | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
bool | বুলিয়ানে রূপান্তর করে। স্বাক্ষরসমূহ: bool(bool) -> boolbool(string) -> boolউদাহরণ: bool("true") // true | ✓ | ✓ | ✓ | ✓ | ✓ |
bytes | বাইটে রূপান্তর করে। স্বাক্ষরসমূহ: bytes(bytes) -> bytesbytes(string) -> bytesউদাহরণ: bytes("hello") // b"hello" | ✓ | ✓ | ✓ | ✓ | ✓ |
double | ডাবল-প্রিসিশন ফ্লোটে রূপান্তর করে। স্বাক্ষরসমূহ: double(double) -> doubledouble(int) -> doubledouble(uint) -> doubledouble(string) -> doubleউদাহরণ: double(1) // 1.0 | ✓ | ✓ | ✓ | ✓ | ✓ |
duration | সময়কালে রূপান্তরিত করে। স্বাক্ষরসমূহ: duration(duration) -> durationduration(string) -> durationউদাহরণ: duration("1.5s") // 1.5s duration | ✓ | ✓ | ✓ | ✓ | ✓ |
int | ৬৪-বিট স্বাক্ষরিত পূর্ণসংখ্যায় রূপান্তর করে। স্বাক্ষরসমূহ: int(int) -> intint(uint) -> intint(double) -> int (শূন্যে রাউন্ড হয়)int(string) -> intint(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) -> timestamptimestamp(string) -> timestamp (RFC3339)উদাহরণ: timestamp("2026-07-23T00:00:00Z") | ✓ | ✓ | ✓ | ✓ | ✓ |
uint | ৬৪-বিটের অচিহ্নিত পূর্ণসংখ্যায় রূপান্তর করে। স্বাক্ষরসমূহ: uint(uint) -> uintuint(int) -> uintuint(double) -> uintuint(string) -> uintউদাহরণ: uint(1) // 1u | ✓ | ✓ | ✓ | ✓ | ✓ |
dyn | টাইপ-চেকিংয়ের জন্য ভ্যালুকে ডাইনামিক টাইপে রূপান্তর করে। স্বাক্ষরসমূহ: dyn(T) -> dynউদাহরণ: dyn([1, "two"]) | ✓ | ✓ | ✓ | ✓ | ✗ |
type | মানটির ধরন ফেরত দেয়। স্বাক্ষরসমূহ: type(T) -> typeউদাহরণ: type(1) // int | ✓ | ✓ | ✓ | ✓ | ✗ |
৪. এক্সটেনশন (লাইব্রেরি)
বাইন্ডিং লাইব্রেরি
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
cel.bind | ডুপ্লিকেট ইভ্যালুয়েশন এড়ানোর জন্য একটি লোকাল ভেরিয়েবল বাইন্ড করে। স্বাক্ষরসমূহ: cel.bind(varName, initExpr, resultExpr) -> Tউদাহরণ: cel.bind(x, a + b, x * x) | ✓ (v0.15.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
cel.NewEnv()ext.Bindings()) পাস করুন। - C++:
CompilerBuilderএBindingsCompilerLibrary()যোগ করুন। (রানটাইম স্বয়ংক্রিয়ভাবে পরিচালিত হয়)। - জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.bindings()যোগ করুন। - পাইথন:
cel_expr_python.ext.ext_bindingsইম্পোর্ট করুন এবংcel.NewEnv(extensions=[...])-এExtBindings()ব্যবহার করুন।
এনকোডার লাইব্রেরি
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
base64.encode | বাইটগুলিকে বেস৬৪ স্ট্রিং-এ এনকোড করে। স্বাক্ষরসমূহ: base64.encode(bytes) -> stringউদাহরণ: base64.encode(b"hello") // "aGVsbG8=" | ✓ (v0.6.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
base64.decode | বেস৬৪ স্ট্রিংকে বাইটে ডিকোড করে। ভুল ইনপুট দিলে ত্রুটি দেখায়। স্বাক্ষরসমূহ: base64.decode(string) -> bytesউদাহরণ: base64.decode("aGVsbG8=") // b"hello" | ✓ (v0.6.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
json.encode | একটি CEL মানকে JSON স্ট্রিং-এ সিরিয়ালাইজ করে। স্বাক্ষরসমূহ: json.encode(dyn) -> stringউদাহরণ: json.encode([1, 2]) // "[1,2]" | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
ext.Encoders()কেcel.NewEnv()-এ পাস করুন। - সি++:
- কম্পাইলার:
CompilerBuilderএEncodersCompilerLibrary()যোগ করুন। - রানটাইম:
FunctionRegistryতেRegisterEncodersFunctions()কল করুন।
- কম্পাইলার:
- জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.encoders()যোগ করুন। - পাইথন:
cel_expr_python.ext.ext_encodersইম্পোর্ট করুন এবংcel.NewEnv(extensions=[...])-এExtEncoders()ব্যবহার করুন।
গণিত গ্রন্থাগার
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
math.greatest | সংখ্যাসূচক আর্গুমেন্টগুলোর (বা সংখ্যাসূচক সংখ্যার তালিকার) মধ্যে বৃহত্তমটি ফেরত দেয়। স্বাক্ষরসমূহ: math.greatest(arg, ...) -> Tউদাহরণ: math.greatest(1, 3, 2) // 3 | ✓ (v0.13.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
math.least | সংখ্যাসূচক আর্গুমেন্টগুলোর (বা সংখ্যাসূচক সংখ্যার তালিকার) মধ্যে সর্বনিম্ন মানটি ফেরত দেয়। স্বাক্ষরসমূহ: math.least(arg, ...) -> Tউদাহরণ: math.least([1, 3, 2]) // 1 | ✓ (v0.13.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
math.abs | পরম মান। স্বাক্ষরসমূহ: math.abs(T) -> T ( int , uint , double সমর্থন করে) <br /><br />**Examples:**<br /> math.abs(-1) // 1` | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.sqrt | বর্গমূল। স্বাক্ষরসমূহ: math.sqrt(T) -> double ( int , uint , double সমর্থন করে) <br /><br />**Examples:**<br /> math.sqrt(9) // 3.0` | ✓ (v0.25.1) | ✓ (v0.12.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
math.bitAnd | বিটওয়াইজ AND। স্বাক্ষরসমূহ: math.bitAnd(T, T) -> T ( int , uint সমর্থন করে) <br /><br />**Examples:**<br /> math.bitAnd(5, 3) // 1` | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitOr | বিটওয়াইজ OR। স্বাক্ষরসমূহ: math.bitOr(T, T) -> T ( int , uint সমর্থন করে ) <br /><br />**Examples:**<br /> math.bitOr(5, 3) // 7` | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitXor | বিটওয়াইজ XOR। স্বাক্ষরসমূহ: math.bitXor(T, T) -> T ( int , uint সমর্থন করে) <br /><br />**Examples:**<br /> math.bitXor(5, 3) // 6` | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitNot | বিটওয়াইজ নয়। স্বাক্ষরসমূহ: math.bitNot(T) -> T ( int , uint সমর্থন করে) <br /><br />**Examples:**<br /> math.bitNot(1) // -2` | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitShiftLeft | বিটওয়াইজ বামে সরান। স্বাক্ষরসমূহ: math.bitShiftLeft(T, int) -> T ( int , uint সমর্থন করে ) <br /><br />**Examples:**<br /> math.bitShiftLeft(1, 2) // 4` | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.bitShiftRight | বিটওয়াইজ শিফট রাইট। স্বাক্ষরসমূহ: math.bitShiftRight(T, int) -> T ( int , uint সমর্থন করে ) <br /><br />**Examples:**<br /> math.bitShiftRight(4, 2) // 1` | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.ceil | ছাদ গোলাকার করা। স্বাক্ষরসমূহ: math.ceil(double) -> doubleউদাহরণ: math.ceil(1.2) // 2.0 | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.floor | মেঝে গোলাকার করা। স্বাক্ষরসমূহ: math.floor(double) -> doubleউদাহরণ: math.floor(1.8) // 1.0 | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.round | নিকটতম পূর্ণসংখ্যায় রাউন্ডিং। স্বাক্ষরসমূহ: math.round(double) -> doubleউদাহরণ: math.round(1.5) // 2.0 | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.trunc | ট্রাঙ্কেশন রাউন্ডিং (শূন্যের দিকে)। স্বাক্ষরসমূহ: math.trunc(double) -> doubleউদাহরণ: math.trunc(-1.8) // -1.0 | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.isInf | ডাবলটি ধনাত্মক না ঋণাত্মক অসীম তা যাচাই করে। স্বাক্ষরসমূহ: math.isInf(double) -> boolউদাহরণ: math.isInf(1.0/0.0) // true | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.isNaN | ডাবলটি NaN কিনা তা যাচাই করে। স্বাক্ষরসমূহ: math.isNaN(double) -> boolউদাহরণ: math.isNaN(0.0/0.0) // true | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.isFinite | ডাবলটি সসীম কিনা তা যাচাই করে। স্বাক্ষরসমূহ: math.isFinite(double) -> boolউদাহরণ: math.isFinite(1.2) // true | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
math.sign | মানের চিহ্ন (-১, ০, বা ১) ফেরত দেয়। স্বাক্ষরসমূহ: math.sign(T) -> T ( int , uint , double সমর্থন করে) <br /><br />**Examples:**<br /> math.sign(-42) // -1` | ✓ (v0.21.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
cel.NewEnv()ext.Math()পাস করুন। - সি++:
- কম্পাইলার:
CompilerBuilderএMathCompilerLibrary()যোগ করুন। - রানটাইম:
FunctionRegistryউপরRegisterMathExtensionFunctions()কল করুন।
- কম্পাইলার:
- জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.math()যোগ করুন। - পাইথন:
cel_expr_python.ext.ext_mathইম্পোর্ট করুন এবংcel.NewEnv(extensions=[...])-এExtMath()ব্যবহার করুন।
প্রোটোস লাইব্রেরি
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
proto.getExt | প্রোটো২ এক্সটেনশন ফিল্ডটি গ্রহণ করে, অথবা সেট করা না থাকলে ডিফল্টটি গ্রহণ করে। স্বাক্ষরসমূহ: proto.getExt(msg, extName) -> Tউদাহরণ: proto.getExt(msg, google.api.expr.test.int32_ext) | ✓ (v0.13.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
proto.hasExt | প্রোটো২ এক্সটেনশন ফিল্ড সেট করা আছে কিনা তা যাচাই করে। স্বাক্ষরসমূহ: proto.hasExt(msg, extName) -> boolউদাহরণ: proto.hasExt(msg, google.api.expr.test.int32_ext) | ✓ (v0.13.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
cel.NewEnv()ext.Protos()) পাস করুন। - C++:
CompilerBuilderএProtoExtCompilerLibrary()যোগ করুন। (রানটাইম স্বয়ংক্রিয়ভাবে পরিচালিত হয়)। - জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.protos()যোগ করুন। - পাইথন:
cel_expr_python.ext.ext_protoইম্পোর্ট করুন এবংcel.NewEnv(extensions=[...])-এExtProto()ব্যবহার করুন।
তালিকা লাইব্রেরি
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
distinct | স্বতন্ত্র উপাদানগুলো ফেরত দেয়। স্বাক্ষরসমূহ: list.distinct() -> listউদাহরণ: [1, 2, 2].distinct() // [1, 2] | ✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
flatten | নেস্টেড লিস্টকে ফ্ল্যাট করে। স্বাক্ষরসমূহ: list.flatten([depth]) -> listউদাহরণ: [[1], [2, 3]].flatten() // [1, 2, 3] | ✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.7.1) | ✓ (v0.1.1) | ✗ |
lists.range | [0, ..., n-1] পূর্ণসংখ্যার একটি তালিকা ফেরত দেয়।স্বাক্ষরসমূহ: lists.range(int) -> list(int)উদাহরণ: lists.range(3) // [0, 1, 2] | ✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
reverse | তালিকাটি উল্টে দেয়। স্বাক্ষরসমূহ: list.reverse() -> listউদাহরণ: [1, 2].reverse() // [2, 1] | ✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
slice | উপ-তালিকা ফেরত দেয় (শুরু অন্তর্ভুক্ত, শেষ বাদে)। স্বাক্ষরসমূহ: list.slice(start, end) -> listউদাহরণ: [1, 2, 3].slice(1, 3) // [2, 3] | ✓ (v0.17.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
sort | তুলনীয় উপাদানগুলোর তালিকা সাজায়। স্বাক্ষরসমূহ: list.sort() -> listউদাহরণ: [3, 1, 2].sort() // [1, 2, 3] | ✓ (v0.22.0) | ✓ (v0.11.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
sortBy | এক্সপ্রেশন থেকে মূল্যায়ন করা কী (key) অনুযায়ী তালিকাটি সাজানো হয়। স্বাক্ষরসমূহ: list.sortBy(var, expr) -> listউদাহরণ: [{"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 | প্রথম উপাদানটিকে ঐচ্ছিক হিসেবে ফেরত দেয়। এর জন্য Optional এক্সটেনশনটি প্রয়োজন। স্বাক্ষরসমূহ: list.first() -> optionalউদাহরণ: [1, 2].first() // optional(1) | ✓ (v0.23.0) | ✓ (v0.15.0) | ✓ (v0.11.0) | ✓ (v0.1.2) | ✗ |
last | শেষ উপাদানটিকে ঐচ্ছিক হিসেবে ফেরত দেয়। এর জন্য Optional এক্সটেনশনটি প্রয়োজন। স্বাক্ষরসমূহ: list.last() -> optionalউদাহরণ: [1, 2].last() // optional(2) | ✓ (v0.23.0) | ✓ (v0.15.0) | ✓ (v0.11.0) | ✓ (v0.1.2) | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
ext.Lists()কেcel.NewEnv()-এ পাস করুন। - সি++:
- কম্পাইলার:
CompilerBuilderএListsCompilerLibrary()যোগ করুন। - রানটাইম:
FunctionRegistryতেRegisterListsFunctions()এবংMacroRegistryতেRegisterListsMacros()কল করুন।
- কম্পাইলার:
- জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.lists()যোগ করুন। - পাইথন:
extensionsতালিকায়listsযোগ করেcel.EnvConfigমাধ্যমে সক্রিয় করুন।
সেট লাইব্রেরি
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
sets.contains | list1-এ list2-এর সমস্ত উপাদান আছে কি না, তা যাচাই করে। স্বাক্ষরসমূহ: sets.contains(list1, list2) -> boolউদাহরণ: sets.contains([1, 2], [1]) // true | ✓ (v0.15.0) | ✓ (v0.10.0) | ✓ (v0.6.0) | ✓ (v0.1.1) | ✗ |
sets.equivalent | তালিকাগুলো সেট-সমতুল্য কিনা (অর্থাৎ সেগুলোতে একই অনন্য উপাদান আছে কিনা) তা যাচাই করে। স্বাক্ষরসমূহ: sets.equivalent(list1, list2) -> boolউদাহরণ: sets.equivalent([1, 2], [2, 1, 1]) // true | ✓ (v0.15.0) | ✓ (v0.10.0) | ✓ (v0.6.0) | ✓ (v0.1.1) | ✗ |
sets.intersects | তালিকাগুলোর মধ্যে অন্তত একটি সাধারণ উপাদান আছে কিনা তা যাচাই করে। স্বাক্ষরসমূহ: sets.intersects(list1, list2) -> boolউদাহরণ: sets.intersects([1, 2], [2, 3]) // true | ✓ (v0.15.0) | ✓ (v0.10.0) | ✓ (v0.6.0) | ✓ (v0.1.1) | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
cel.NewEnv()ext.Sets()) পাস করুন। - সি++:
- কম্পাইলার:
CompilerBuilderএSetsCompilerLibrary()যোগ করুন। - রানটাইম:
FunctionRegistryউপরRegisterSetsFunctions()কল করুন।
- কম্পাইলার:
- জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.sets()যোগ করুন। - পাইথন:
extensionsতালিকায়setsযোগ করেcel.EnvConfigমাধ্যমে এটি সক্রিয় করুন।
স্ট্রিংস লাইব্রেরি
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
charAt | ইনডেক্সে থাকা ক্যারেক্টারটি ফেরত দেয়। স্বাক্ষরসমূহ: string.charAt(int) -> stringউদাহরণ: "hello".charAt(1) // "e" | ✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
indexOf | সাবস্ট্রিংটির প্রথম উপস্থিতির সূচক, অথবা -১ ফেরত দেয়। স্বাক্ষরসমূহ: string.indexOf(substr, [start]) -> intউদাহরণ: "hello".indexOf("l") // 2 | ✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
lastIndexOf | সাবস্ট্রিংটির সর্বশেষ উপস্থিতির সূচক, অথবা -১ ফেরত দেয়। স্বাক্ষরসমূহ: string.lastIndexOf(substr, [end]) -> intউদাহরণ: "hello".lastIndexOf("l") // 3 | ✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
join | স্ট্রিং সংযুক্ত করে। স্বাক্ষরসমূহ: list(string).join([separator]) -> stringউদাহরণ: ["a", "b"].join("-") // "ab" | ✓ (v0.10.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
split | বিভাজক দ্বারা স্ট্রিং বিভক্ত করে। স্বাক্ষরসমূহ: string.split(separator, [limit]) -> list(string)উদাহরণ: "ab".split("-") // ["a", "b"] | ✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
substring | সাবস্ট্রিং ফেরত দেয় (শুরু অন্তর্ভুক্ত, শেষ বাদে)। স্বাক্ষরসমূহ: string.substring(start, [end]) -> stringউদাহরণ: "hello".substring(1, 3) // "el" | ✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
trim | ইউনিকোড হোয়াইটস্পেস ছাঁটাই করে। স্বাক্ষরসমূহ: string.trim() -> stringউদাহরণ: " hello ".trim() // "hello" | ✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
replace | পুরানোগুলোর পরিবর্তে নতুনগুলো প্রতিস্থাপন করে। স্বাক্ষরসমূহ: string.replace(old, new, [limit]) -> stringউদাহরণ: "hello".replace("l", "w") // "hewwo" | ✓ (v0.4.0) | ✓ (v0.10.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
reverse | ইউনিকোড কোড পয়েন্টগুলোকে উল্টে দেয়। স্বাক্ষরসমূহ: string.reverse() -> stringউদাহরণ: "abc".reverse() // "cba" | ✓ (v0.18.0) | ✓ (v0.14.0) | ✓ (v0.13.0) | ✓ (v0.1.1) | ✗ |
lowerAscii | ASCII অক্ষরগুলোকে ছোট হাতের অক্ষরে রূপান্তর করে। স্বাক্ষরসমূহ: string.lowerAscii() -> stringউদাহরণ: "Hello".lowerAscii() // "hello" | ✓ (v0.6.0) | ✓ (v0.11.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
upperAscii | ASCII অক্ষরগুলোকে বড় হাতের অক্ষরে রূপান্তর করে। স্বাক্ষরসমূহ: string.upperAscii() -> stringউদাহরণ: "Hello".upperAscii() // "HELLO" | ✓ (v0.6.0) | ✓ (v0.11.0) | ✓ (v0.2.0) | ✓ (v0.1.1) | ✗ |
quote | নিরাপদ মুদ্রণের জন্য স্ট্রিং এস্কেপ করা হয়। স্বাক্ষরসমূহ: strings.quote(string) -> stringউদাহরণ: strings.quote("a\tb") // "\"a\\tb\"" | ✓ (v0.14.0) | ✓ (v0.14.0) | ✓ (v0.13.0) | ✓ (v0.1.1) | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
ext.Strings()কেcel.NewEnv()-এ পাস করুন। - সি++:
- কম্পাইলার:
CompilerBuilderএStringsCompilerLibrary()যোগ করুন। - রানটাইম:
FunctionRegistryউপরRegisterStringsFunctions()কল করুন।
- কম্পাইলার:
- জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.strings()যোগ করুন। - পাইথন:
cel_expr_python.ext.ext_stringsইম্পোর্ট করুন এবংcel.NewEnv(extensions=[...])-এExtStrings()ব্যবহার করুন।
রেগুলার এক্সপ্রেশন লাইব্রেরি
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
regex.replace | মিলগুলোকে প্রতিস্থাপন স্ট্রিং দিয়ে বদলে দেয় (ব্যাকরেফারেন্স সমর্থন করে)। স্বাক্ষরসমূহ: regex.replace(target, pat, repl, [limit]) -> stringউদাহরণ: 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 | প্যাটার্নের প্রথম মিলটি ফেরত দেয় (এতে অবশ্যই একটি ক্যাপচার গ্রুপ থাকতে হবে)। স্বাক্ষরসমূহ: regex.extract(target, pat) -> optional(string)উদাহরণ: regex.extract("a123b", r"(\d+)") // optional("123") | ✓ (v0.25.1) | ✓ (v0.13.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
regex.extractAll | প্যাটার্নটির সমস্ত মিল ফেরত দেয় (এতে অবশ্যই একটি ক্যাপচার গ্রুপ থাকতে হবে)। স্বাক্ষরসমূহ: regex.extractAll(target, pat) -> list(string)উদাহরণ: regex.extractAll("a1b2", r"(\d+)") // ["1", "2"] | ✓ (v0.25.1) | ✓ (v0.13.0) | ✓ (v0.10.1) | ✓ (v0.1.1) | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
cel.NewEnv()ext.Regex()) পাস করুন। - সি++:
- কম্পাইলার:
CompilerBuilderএRegexExtCompilerLibrary()যোগ করুন। - রানটাইম:
FunctionRegistryতেRegisterRegexExtensionFunctions()কল করুন।
- কম্পাইলার:
- জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.regex()যোগ করুন। - পাইথন:
cel.EnvConfigএরextensionsতালিকায়regexএবংoptionalযোগ করে এটি সক্রিয় করুন।
দ্বি-চলক বোধগম্যতা
| ম্যাক্রো | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
all | কী/ইনডেক্স এবং ভ্যালুর মধ্যে লজিক্যাল AND ফাংশনের শর্ট-সার্কিটিং। স্বাক্ষরসমূহ: list.all(i, v, pred) -> boolmap.all(k, v, pred) -> boolউদাহরণ: [1, 2].all(i, v, v > 0) // true | ✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
exists | কী/ইনডেক্স এবং ভ্যালুর মধ্যে লজিক্যাল OR শর্ট-সার্কিট করা। স্বাক্ষরসমূহ: list.exists(i, v, pred) -> boolmap.exists(k, v, pred) -> boolউদাহরণ: [1, 2].exists(i, v, v == 2) // true | ✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
existsOne | যাচাই করে যে ঠিক একটি জোড়া শর্তটি পূরণ করে কি না। স্বাক্ষরসমূহ: list.existsOne(i, v, pred) -> boolmap.existsOne(k, v, pred) -> boolউদাহরণ: [1, 2].existsOne(i, v, v == 2) // true | ✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
transformList | তালিকা/ম্যাপকে একটি তালিকায় রূপান্তর বা ফিল্টার করে। স্বাক্ষরসমূহ: list.transformList(i, v, [filter], transform) -> listmap.transformList(k, v, [filter], transform) -> listউদাহরণ: [1, 2].transformList(i, v, v * 2) // [2, 4] | ✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
transformMap | লিস্ট/ম্যাপের মানগুলোকে একটি ম্যাপে রূপান্তর করে (কীগুলো অপরিবর্তিত থাকে)। স্বাক্ষরসমূহ: list.transformMap(i, v, [filter], transform) -> mapmap.transformMap(k, v, [filter], transform) -> mapউদাহরণ: [1, 2].transformMap(i, v, v * 2) // {0: 2, 1: 4} | ✓ (v0.22.0) | ✓ (v0.14.0) | ✓ (v0.11.0) | ✓ (v0.1.1) | ✗ |
transformMapEntry | মানচিত্রে রূপান্তরিত হয়। স্বাক্ষরসমূহ: list.transformMapEntry(i, v, [filter], transform_entry) -> mapmap.transformMapEntry(k, v, [filter], transform_entry) -> mapউদাহরণ: [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) | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
cel.NewEnv()ext.TwoVarComprehensions()) পাস করুন। - সি++:
- কম্পাইলার:
CompilerBuilderএComprehensionsV2CompilerLibrary()যোগ করুন। - রানটাইম:
FunctionRegistryতেRegisterComprehensionsV2Functions()এবংMacroRegistryতেRegisterComprehensionsV2Macros()কল করুন।
- কম্পাইলার:
- জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.comprehensions()যোগ করুন। - পাইথন:
cel.EnvConfigএরextensionsতালিকায়two-var-comprehensionsযোগ করে এটি সক্রিয় করুন।
নেটিভ টাইপস লাইব্রেরি
| বৈশিষ্ট্য | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
| নেটিভ স্ট্রাক্টস | CEL-এ হোস্ট নেটিভ টাইপ (Go struct / Java POJO) নিবন্ধন এবং ইনস্ট্যানশিয়েট করা। উদাহরণ: Account{id: 123} (সিইএল-এ ইনস্ট্যান্সকৃত জাভা পিওজো) | ✓ (v0.13.0) | ✗ | ✓ (v0.13.0) | ✗ | ✗ |
কীভাবে সক্রিয় করবেন
- Go:
cel.NewEnv()-তেext.NativeTypes(...)(রিফ্লেক্ট টাইপ প্রদান করে) পাস করুন। - সি++ সমর্থিত নয়।
- জাভা:
CelCompilerএবংCelRuntimeবিল্ডারগুলিতেCelExtensions.nativeTypes()(জাভা ক্লাস সরবরাহ করার জন্য) যোগ করুন। - পাইথন: সমর্থিত নয়।
নেটওয়ার্ক লাইব্রেরি
নেটওয়ার্ক লাইব্রেরিটি আইপি অ্যাড্রেস এবং সিআইডিআর ব্লক পার্সিং, ভ্যালিডেশন এবং ম্যানিপুলেট করার জন্য ফাংশন সরবরাহ করে।
| ফাংশন | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
ip | একটি স্ট্রিংকে পার্স করে আইপি অ্যাড্রেসে রূপান্তর করে, অথবা সিআইডিআর (CIDR) থেকে আইপি বের করে। স্বাক্ষরসমূহ: ip(string) -> IPCIDR.ip() -> IPউদাহরণ: ip("192.168.0.1")cidr("192.168.0.0/24").ip() | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isIP | একটি স্ট্রিং বৈধ আইপি অ্যাড্রেস কিনা তা যাচাই করে। স্বাক্ষরসমূহ: isIP(string) -> boolউদাহরণ: isIP("192.168.0.1") // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
ip.isCanonical | একটি আইপি অ্যাড্রেস স্ট্রিং তার প্রমিত বিন্যাসে আছে কিনা তা যাচাই করে। স্বাক্ষরসমূহ: ip.isCanonical(string) -> boolউদাহরণ: ip.isCanonical("192.168.0.1") // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
cidr | একটি স্ট্রিংকে পার্স করে একটি CIDR ব্লকে রূপান্তর করে। স্বাক্ষরসমূহ: cidr(string) -> CIDRউদাহরণ: cidr("192.168.0.0/24") | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isCIDR | একটি স্ট্রিং বৈধ CIDR ব্লক কিনা তা যাচাই করে। স্বাক্ষরসমূহ: isCIDR(string) -> boolউদাহরণ: isCIDR("192.168.0.0/24") // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
containsIP | একটি CIDR ব্লকে IP অ্যাড্রেস আছে কিনা তা যাচাই করে। স্বাক্ষরসমূহ: CIDR.containsIP(IP) -> boolCIDR.containsIP(string) -> boolউদাহরণ: cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
containsCIDR | একটি CIDR ব্লকের মধ্যে অন্য একটি CIDR ব্লক আছে কিনা তা যাচাই করে। স্বাক্ষরসমূহ: CIDR.containsCIDR(CIDR) -> boolCIDR.containsCIDR(string) -> boolউদাহরণ: cidr("192.168.0.0/16").containsCIDR(cidr("192.168.1.0/24")) // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
family | আইপি ফ্যামিলি ফেরত দেয় (IPv4-এর জন্য 4, IPv6-এর জন্য 6)। স্বাক্ষরসমূহ: IP.family() -> intউদাহরণ: ip("192.168.0.1").family() // 4 | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isGlobalUnicast | আইপিটি একটি গ্লোবাল ইউনিকাস্ট অ্যাড্রেস কিনা তা যাচাই করে। স্বাক্ষরসমূহ: IP.isGlobalUnicast() -> boolউদাহরণ: ip("192.168.0.1").isGlobalUnicast() // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLinkLocalMulticast | আইপিটি একটি লিঙ্ক-লোকাল মাল্টিকাস্ট অ্যাড্রেস কিনা তা যাচাই করে। স্বাক্ষরসমূহ: IP.isLinkLocalMulticast() -> boolউদাহরণ: ip("224.0.0.1").isLinkLocalMulticast() // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLinkLocalUnicast | আইপিটি একটি লিঙ্ক-লোকাল ইউনিকাস্ট অ্যাড্রেস কিনা তা যাচাই করে। স্বাক্ষরসমূহ: IP.isLinkLocalUnicast() -> boolউদাহরণ: ip("169.254.0.1").isLinkLocalUnicast() // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLoopback | আইপিটি লুপব্যাক অ্যাড্রেস কিনা তা যাচাই করে। স্বাক্ষরসমূহ: IP.isLoopback() -> boolউদাহরণ: ip("127.0.0.1").isLoopback() // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isMask | CIDR-টি একটি বৈধ সাবনেট মাস্ক কিনা তা যাচাই করে। স্বাক্ষরসমূহ: CIDR.isMask() -> boolউদাহরণ: cidr("255.255.255.0/24").isMask() // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
isUnspecified | আইপি ঠিকানাটি অনির্দিষ্ট কিনা তা যাচাই করে (যেমন 0.0.0.0 )।স্বাক্ষরসমূহ: IP.isUnspecified() -> boolউদাহরণ: ip("0.0.0.0").isUnspecified() // true | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
masked | মাস্ক করা CIDR ব্লকটি ফেরত দেয়। স্বাক্ষরসমূহ: CIDR.masked() -> CIDRউদাহরণ: cidr("192.168.0.1/24").masked() // 192.168.0.0/24 | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
prefixLength | CIDR ব্লকের প্রিফিক্স দৈর্ঘ্য ফেরত দেয়। স্বাক্ষরসমূহ: CIDR.prefixLength() -> intউদাহরণ: cidr("192.168.0.0/24").prefixLength() // 24 | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
string | আইপি বা সিআইডিআর-কে স্ট্রিং-এ রূপান্তর করে। স্বাক্ষরসমূহ: string(IP) -> stringstring(CIDR) -> stringউদাহরণ: string(ip("192.168.0.1")) // "192.168.0.1" | ✓ (v0.29.0) | ✗ | ✗ | ✗ | ✗ |
কীভাবে সক্রিয় করবেন
- যান:
cel.NewEnv()ext.Network()পাস করুন। - সি++ সমর্থিত নয়।
- জাভা: সমর্থিত নয়।
- পাইথন: সমর্থিত নয়।
৫. উন্নত বৈশিষ্ট্য
উন্নত বৈশিষ্ট্যগুলির সারাংশ
| বৈশিষ্ট্য | বর্ণনা | যান | সি++ | জাভা | পাইথন | সি |
|---|---|---|---|---|---|---|
| আংশিক মূল্যায়ন | অনুপস্থিত ইনপুট দিয়ে মূল্যায়ন করলে, এটি অজানা মান অথবা একটি সরলীকৃত রাশি ফেরত দেয়। | ✓ ³ | ✓ ⁴ | ✓ ⁴ | ✗ | ✗ |
| অ্যাসিঙ্ক মূল্যায়ন | এক্সটেনশন ফাংশনগুলোর নন-ব্লকিং কনকারেন্ট এক্সিকিউশন। | ✓ ⁵ | ✗ | ✓ ⁶ | ✗ | ✗ |
| AST ভ্যালিডেটর | টাইপ-চেকিংয়ের পরে চেক করা AST-এর উপর স্ট্যাটিক অ্যানালাইসিস যাচাই করা হয়। | ✓ | ✓ | ✓ | ✗ | ✗ |
| AST অপ্টিমাইজার | পারফরম্যান্স উন্নত করার জন্য AST কোড পুনর্লিখন করে (যেমন: কনস্ট্যান্ট ফোল্ডিং, ইনলাইনিং, CSE)। | ✓ | ✓ | ✓ | ✗ | ✗ |
| সিইএল পলিসি কম্পাইলার | YAML-ভিত্তিক পলিসি কাঠামোকে স্ট্যান্ডার্ড CEL AST-তে কম্পাইল করে। | ✓ | ✓ | ✓ | ✗ | ✗ |
³ Go রেসিডুয়াল AST (প্রুনড AST) তৈরি করা সমর্থন করে। ⁴ C++ এবং Java রানটাইমে UnknownSet / CelUnknownSet রিটার্ন করা সমর্থন করে, কিন্তু রেসিডুয়াল AST তৈরির জন্য কোনো পাবলিক API প্রকাশ করে না। ⁵ Go চ্যানেল রিটার্ন করার জন্য AsyncBinding / AsyncOp ব্যবহার করে। ⁶ Java ListenableFuture রিটার্ন করার জন্য CelAsyncRuntime ব্যবহার করে।
আংশিক মূল্যায়ন (অজানা বিষয়)
আংশিক মূল্যায়ন এমন পরিস্থিতিতেও কোনো এক্সপ্রেশন মূল্যায়ন করার সুযোগ দেয়, যখন ইনপুট ভেরিয়েবলগুলোর (আর্গুমেন্ট) কেবল একটি উপসেট জানা থাকে। মূল্যায়নটি ব্যর্থ না হয়ে, এমন একটি ফলাফল তৈরি করে যা নির্দেশ করে কী অনুপস্থিত, অথবা একটি সরলীকৃত এক্সপ্রেশন প্রদান করে।
- Go: সম্পূর্ণ সমর্থন। অজানা অ্যাট্রিবিউটের প্যাটার্ন সহ একটি
PartialActivationসংজ্ঞায়িত করার সুযোগ দেয়। ইভ্যালুয়েশন একটিtypes.Unknownভ্যালু রিটার্ন করে। Go একটি Residual AST (Env.ResidualAst) তৈরি করা সমর্থন করে, যা হলো একটি ছাঁটাই করা, সরলীকৃত AST এবং এতে এক্সপ্রেশনের শুধুমাত্র সেই অংশগুলো থাকে যা ইভ্যালুয়েট করা যায়নি। - C++:
Unknownমান সমর্থন করে। অজানা অ্যাট্রিবিউট প্যাটার্নগুলোActivation::set_unknown_attribute_patternsএর মাধ্যমে কনফিগার করা হয়। ইভ্যালুয়েশন একটিUnknownSetরিটার্ন করে। পাবলিক এপিআই বর্তমানে রেসিডুয়াল AST জেনারেশন প্রকাশ করে না। - জাভা:
Program.eval()-এPartialVarsপাস করার মাধ্যমে আংশিক মূল্যায়ন সমর্থন করে। মূল্যায়ন একটিCelUnknownSetরিটার্ন করে। পাবলিক এপিআই বর্তমানে রেসিডুয়াল AST জেনারেশন প্রকাশ করে না। - পাইথন / সি: কোনো নেটিভ সাপোর্ট নেই।
অ্যাসিঙ্ক মূল্যায়ন
অ্যাসিঙ্ক ইভ্যালুয়েশন CEL এক্সপ্রেশনকে এমন ফাংশন কল করার সুযোগ দেয় যা অ্যাসিঙ্ক্রোনাসভাবে এক্সিকিউট হয় (যেমন, RPC বা ডাটাবেস কোয়েরি করা) এবং মূল এক্সিকিউশন থ্রেডকে ব্লক না করেই ফলাফল পাওয়া পর্যন্ত ইভ্যালুয়েশনকে আটকে রাখে।
- Go:
AsyncBindingএবংAsyncOpমাধ্যমে অ্যাসিঙ্ক্রোনাস ফাংশন ওভারলোড সমর্থন করে। অ্যাসিঙ্ক ফাংশনগুলো একটি Go চ্যানেল (<-chan ref.Val) রিটার্ন করে, এবং ইন্টারপ্রেটার এর যুগপৎ সম্পাদন ও সিনক্রোনাইজেশন পরিচালনা করে। - জাভা:
CelAsyncRuntimeএবংAsyncProgramমাধ্যমে অ্যাসিঙ্ক ইভ্যালুয়েশন সমর্থন করে। এটি পেন্ডিং ভ্যালুগুলো উপস্থাপন করতেListenableFutureব্যবহার করে এবং ফিউচারগুলো রিজলভ হওয়ার সাথে সাথে স্বয়ংক্রিয়ভাবে ইভ্যালুয়েশন সম্পন্ন করে। - সি++ / পাইথন / সি: কোনো অন্তর্নির্মিত সমর্থন নেই।
AST ভ্যালিডেটর
প্রোগ্রামটি কার্যকর করার আগে, ভ্যালিডেটররা টাইপ-চেকিং শেষে ডোমেন-নির্দিষ্ট সীমাবদ্ধতা প্রয়োগ করার জন্য পরীক্ষিত AST-এর উপর স্ট্যাটিক বিশ্লেষণ সম্পাদন করে।
- Go:
ASTValidatorইন্টারফেস সমর্থন করে। প্রামাণ্য ভ্যালিডেটরগুলোর মধ্যে রয়েছেcel.validator.duration,cel.validator.timestamp,cel.validator.matches(regex),cel.validator.homogeneous_literals, এবংcel.validator.comprehension_nesting_limit। - C++:
cel::Validatorসমর্থন করে। প্রমিত ভ্যালিডেশনগুলোর মধ্যে রয়েছেAstDepthValidator,ComprehensionNestingLimitValidator,DurationLiteralValidator,HomogeneousLiteralValidator,MatchesValidatorএবংTimestampLiteralValidator। - জাভা:
CelValidatorএবংCelAstValidatorসমর্থন করে। প্রমিত ভ্যালিডেটরগুলোর মধ্যে রয়েছেAstDepthLimitValidator,ComprehensionNestingLimitValidator,DurationLiteralValidator,HomogeneousLiteralValidator,RegexLiteralValidatorএবংTimestampLiteralValidator। - পাইথন / সি: সরাসরি সমর্থন নেই।
AST অপ্টিমাইজার
অপ্টিমাইজাররা এক্সিকিউশন পারফরম্যান্স উন্নত করার জন্য AST পুনর্লিখন করে। অপ্টিমাইজাররা দুটি বিভাগের একটিতে পড়ে: স্ট্যাটিক এবং রানটাইম অপ্টিমাইজার। C++, Java, এবং Go রানটাইম অপ্টিমাইজেশন সমর্থন করে। CEL Java এবং Go স্ট্যাটিক অপ্টিমাইজারও সমর্থন করে। সাধারণ অপ্টিমাইজেশনগুলির মধ্যে রয়েছে কনস্ট্যান্ট ফোল্ডিং (ধ্রুবক ইনপুট দিয়ে সাব-এক্সপ্রেশনগুলির পূর্ব-মূল্যায়ন) এবং কমন সাবএক্সপ্রেশন এলিমিনেশন (CSE)।
- Go: কম্পাইলেশন/প্ল্যানিং চলাকালীন AST ফোল্ডিং সমর্থন করে।
- C++: প্ল্যান করার সময়
cel::extensions::EnableConstantFoldingএক্সটেনশনের মাধ্যমে কনস্ট্যান্ট ফোল্ডিং সমর্থন করে। - জাভা:
CelOptimizerইন্টারফেস সমর্থন করে। প্রমিত অপটিমাইজারগুলোর মধ্যে রয়েছেConstantFoldingOptimizer(যা আংশিক মূল্যায়ন অনুকরণ করে শর্ট-সার্কিটিং ব্রাঞ্চগুলোকে ফোল্ড করতে পারে),InliningOptimizer, এবংSubexpressionOptimizer(CSE)। - পাইথন / সি: সরাসরি সমর্থন নেই।
সিইএল পলিসি কম্পাইলার
CEL পলিসি হলো একটি YAML-ভিত্তিক ফরম্যাট, যা ভেরিয়েবল, ম্যাচ ব্লক, শর্তসাপেক্ষ আউটপুট এবং নেস্টেড রুলের সাথে একাধিক CEL এক্সপ্রেশন একত্রিত করার জন্য ব্যবহৃত হয়। এটি জটিল পলিসি ইঞ্জিনগুলোর (যেমন কুবারনেটিস অ্যাডমিশন কন্ট্রোল) জন্য ডিজাইন করা হয়েছে, যেখানে একক CEL এক্সপ্রেশন পাঠযোগ্যতা হারায়।
পলিসি কম্পাইলার এই YAML পলিসিগুলোকে একটি একক স্ট্যান্ডার্ড CEL AST-তে কম্পাইল করে, যার ফলে এগুলো স্ট্যান্ডার্ড CEL রানটাইমগুলোর সাথে সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ হয় এবং সমস্ত পারফরম্যান্স ও সুরক্ষা নিশ্চয়তা লাভ করে।
- Go:
third_party/cel/go/policyএর মাধ্যমে সমর্থিত। - C++:
third_party/cel/cpp/policyএর মাধ্যমে সমর্থিত। - জাভা:
third_party/java/cel/policyএর মাধ্যমে সমর্থিত। - পাইথন / সি: সরাসরি সমর্থিত নয়।