Stella Expression Language Engine (StellaEL)

Merhaba arkadaşlar, rust ile geliştirdiğim bir expression dilinin prototipini hikayesi ile birlikte tanıtmak için bu yazıyı hazırladım iyi okumalar;

.NET ekosisteminde kişisel projelerimde aynı kütüphaneleri kullanıyordum. Validasyon, mapping, feature-flag, rule-engine, vs. Ancak son 1–2 yılda birçok popüler kütüphane art arda commercial modele geçmeye başladı.

Abonelik isteyenler, enterprise fiyatlandırmaya dönenler, OSS sürümünü kısıtlayanlar derken…

En çok da validasyon tarafında gelecekte oluşabilecek bağımlılık riskleri canımı sıkmaya başladı. Validasyon gibi uygulamanın çekirdeğinde duran bir şeyin:

  • yarın ücretli olması,

  • lisans değiştirip API’yi kapatması,

  • güncelleme almayı bırakması

gibi can sıkıcı riskleri yeni projelerimde almamak adına kendi validasyon kütüphanemi yazayım dedim. Ama validasyon kurallarını:

Klasik railway stili result = Validate().Then(...).Then(...); yerine DSL tabanlı şöyle bir şey yazabilmek istiyordum:


[Validate(this GT 10)]

[Validate(username NOT EMPTY)]

[Validate(age IS NOT EQUAL 0)]

C# içinde DSL yazmak çok pahalı olabileceği için bende rust ile yazıp bunu FFI ile tüm dillere gömülebilir bir şekilde tasarlamaya karar verdim.

Stella Expression Language Engine (StellaEL)

Rust ile yazılmış, C ABI tabanlı bir ifade yorumlayıcısı.

StellaEL sayesinde C#, Go, Python, Node ve daha pek çok dilde şu yapılabilir:


[Validate("age GT 18")]

[Validate("username NOT EMPTY")]

Arka planda C# sadece string’i iletir,

StellaEL ise parse eder, AST oluşturur, değerlendirir ve sonucu döndürür.

Rust ile yazılmış StellaEL diğer dillerle nasıl çalışacak?

Örnek olarak C# tarafı yalnızca P/Invoke üzerinden Rust kütüphanesini çağırıyor:


[DllImport("stellael", CallingConvention = CallingConvention.Cdecl)]

public static extern IntPtr eval_expr(string input);

Sonra sonuç JSON/String olarak geri dönüyor ve validasyon kütüphanem bunu parse edip kullanabiliyor.

Bütün expression motoru Rust’ın içinde:

  • Lexer

  • Parser (Pratt)

  • AST

  • Evaluator

  • Type coercion

  • operatorler

  • Sandbox execution

  • Heap yok GC yok

uygulama ise sadece sonuçla ilgileniyor.

Yol Haritası — FFI & Protokoller

  • C ABI (çekirdek hazır)

  • .NET P/Invoke (çekirdek hazır)

  • Python ctypes

  • Go cgo

  • Node.js N-API / Bun / Deno

  • WASM (browser / Node)

  • IPC:

    • Unix domain socket

    • Named pipe

    • JSON-RPC

    • MessagePack-RPC

StellaEL ne amaçlarla kullanılabilir

  • feature flag motorları

  • authorization rule engine

  • oyun mekaniği scripting

  • workflow koşulları

  • data filtering DSL

  • policy evaluators

StellaEL nasil bir görünüme sahip

String literal


STR(buraya yazılan herşey string literal)

STR() parantezi içine yazılan " ' karakteri gerçek " ' karakterleri yansıtır, kaçış karakterleri \', \" veya stringi " , ' karakterleri ile sarmalamak gerekmez

Matematik


2 + 3 * 4


-(5 + 3)


(1.5e2) / 3

Karşılaştırma


age GT 18


price NOT LT 100


username IS NOT EQ STR(admin) AND email NOT EMPTY

IS burda tamamen synonym, yorumlayıcı açısından IS NOT EQ ile NOT EQ arasında fark yoktur.

Boolean Logic


is_verified AND (age GT 18)

Mixed


(price * discount) GT 10.5

Kaynak & Kurulum

StellaEL açık kaynaklıdır ve tamamen MIT lisansı ile yayınlanacaktır.

Projeyi incelemek, katkıda bulunmak veya denemek için GitHub deposuna göz atabilirsiniz:

Eğer makinenizde Rust kuruluysa, depoyu klonlayarak hızlıca çalıştırabilirsiniz:


git clone https://github.com/stellayazilim/Stella.StellaEL


cd Stella.StellaEL

main.rs dosyası küçük bir “playground” gibi kullanıp deneyebilirsiniz.


cargo run

Testleri çalıştırmak için:


cargo test

2 Beğeni