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