mirror of
https://github.com/duhanbalci/dexpr.git
synced 2026-07-01 16:19:16 +00:00
158 lines
4.9 KiB
Markdown
158 lines
4.9 KiB
Markdown
# Language Info Modülü
|
||
|
||
**Konum:** `src/language_info.rs`
|
||
|
||
Editör entegrasyonu için dil metadata'sı üretir. Built-in fonksiyonlar, tipe göre metodlar ve host-kayıtlı genişletmeleri JSON formatında dışa aktarır. Frontend editör kütüphanesi (`codemirror-lang-dexpr`) bu JSON'u alarak tip-bazlı autocomplete sağlar.
|
||
|
||
---
|
||
|
||
## Yapılar
|
||
|
||
### FunctionInfo
|
||
|
||
| Alan | Tip | Açıklama |
|
||
|------|-----|----------|
|
||
| `name` | `&'static str` | Fonksiyon adı |
|
||
| `signature` | `&'static str` | İmza (örn: `"(min, max) -> Number"`) |
|
||
| `doc` | `Option<&'static str>` | Opsiyonel açıklama |
|
||
|
||
### MethodInfo
|
||
|
||
| Alan | Tip | Açıklama |
|
||
|------|-----|----------|
|
||
| `name` | `&'static str` | Metod adı |
|
||
| `signature` | `&'static str` | İmza (örn: `"() -> String"`) |
|
||
| `doc` | `Option<&'static str>` | Opsiyonel açıklama |
|
||
|
||
### VariableInfo
|
||
|
||
| Alan | Tip | Açıklama |
|
||
|------|-----|----------|
|
||
| `name` | `String` | Değişken adı |
|
||
| `type_name` | `String` | Tip adı: `String`, `Number`, `Boolean`, `NumberList`, `StringList`, `Object`, `List` |
|
||
| `doc` | `Option<String>` | Opsiyonel açıklama |
|
||
|
||
### LanguageInfo
|
||
|
||
Tüm metadata'yı toplayan ana yapı.
|
||
|
||
| Alan | Tip | Açıklama |
|
||
|------|-----|----------|
|
||
| `functions` | `Vec<FunctionInfo>` | Fonksiyon listesi |
|
||
| `methods` | `Vec<(&'static str, Vec<MethodInfo>)>` | Tipe göre metod listesi |
|
||
| `variables` | `Vec<VariableInfo>` | Değişken listesi |
|
||
|
||
---
|
||
|
||
## Metodlar
|
||
|
||
### `LanguageInfo::builtin() -> Self`
|
||
|
||
Tüm built-in fonksiyon ve metodları içeren yeni bir `LanguageInfo` oluşturur.
|
||
|
||
**Built-in fonksiyonlar:** `log`, `rand`
|
||
|
||
**Built-in metodlar (tipe göre):**
|
||
|
||
| Tip | Metodlar |
|
||
|-----|----------|
|
||
| `String` | `upper`, `lower`, `trim`, `trimStart`, `trimEnd`, `split`, `replace`, `contains`, `startsWith`, `endsWith`, `length`, `charAt`, `substring` |
|
||
| `Number` | *(yok)* |
|
||
| `Boolean` | *(yok)* |
|
||
| `NumberList` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `sort`, `sum`, `avg`, `min`, `max` |
|
||
| `StringList` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `sort`, `join` |
|
||
| `Object` | `keys`, `values`, `length`, `len`, `contains`, `get` |
|
||
| `List` | `length`, `len`, `isEmpty`, `first`, `last`, `get`, `contains`, `indexOf`, `slice`, `reverse`, `join`, `map`, `filter`, `find`, `sort` |
|
||
|
||
### `add_function(name, signature, doc)`
|
||
|
||
Host-kayıtlı fonksiyon ekler (VM'deki `register_function` ile eşleşir).
|
||
|
||
### `add_method(type_name, name, signature, doc)`
|
||
|
||
Host-kayıtlı metod ekler (VM'deki `register_method` ile eşleşir). Belirtilen tipe ait metod listesine eklenir.
|
||
|
||
### `add_variable(name, type_name, doc)`
|
||
|
||
External değişken ekler (VM'deki `set_global` ile eşleşir). Editörde autocomplete ve tip-bazlı metod önerileri için kullanılır.
|
||
|
||
### `to_json() -> String`
|
||
|
||
Tüm metadata'yı JSON formatında serileştirir. Frontend editör kütüphanesine gönderilecek çıktıyı üretir.
|
||
|
||
---
|
||
|
||
## JSON Formatı
|
||
|
||
`to_json()` çıktısı:
|
||
|
||
```json
|
||
{
|
||
"functions": [
|
||
{"name": "log", "signature": "(...args) -> null", "doc": "Print values to output"},
|
||
{"name": "getRate", "signature": "(code: String) -> Number", "doc": "Get exchange rate"}
|
||
],
|
||
"methods": {
|
||
"String": [
|
||
{"name": "upper", "signature": "() -> String"},
|
||
{"name": "toTitleCase", "signature": "() -> String", "doc": "Custom host method"}
|
||
],
|
||
"Number": [],
|
||
"NumberList": [
|
||
{"name": "sum", "signature": "() -> Number"}
|
||
],
|
||
"StringList": [
|
||
{"name": "join", "signature": "(delim?: String) -> String"}
|
||
]
|
||
},
|
||
"variables": [
|
||
{"name": "price", "type": "Number"},
|
||
{"name": "category", "type": "String", "doc": "Product category"}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Kullanım Örneği
|
||
|
||
```rust
|
||
use dexpr::language_info::LanguageInfo;
|
||
|
||
// 1. Built-in metadata oluştur
|
||
let mut info = LanguageInfo::builtin();
|
||
|
||
// 2. Host fonksiyonları ekle (register_function ile eşleşmeli)
|
||
info.add_function("getRate", "(code: String) -> Number", Some("Get exchange rate"));
|
||
info.add_function("fetchPrice", "(sku: String) -> Number", None);
|
||
|
||
// 3. Host metodları ekle (register_method ile eşleşmeli)
|
||
info.add_method("String", "toTitleCase", "() -> String", None);
|
||
|
||
// 4. External değişkenleri ekle (set_global ile eşleşmeli)
|
||
info.add_variable("price", "Number", None);
|
||
info.add_variable("category", "String", Some("Ürün kategorisi".to_string()));
|
||
info.add_variable("items", "StringList", None);
|
||
|
||
// 5. JSON üret ve frontend'e gönder
|
||
let json = info.to_json();
|
||
// json -> HTTP response, WebSocket message, vb.
|
||
```
|
||
|
||
---
|
||
|
||
## Frontend Entegrasyonu
|
||
|
||
Üretilen JSON doğrudan `codemirror-lang-dexpr` kütüphanesine verilir:
|
||
|
||
```typescript
|
||
import { dexpr } from "codemirror-lang-dexpr";
|
||
|
||
// Rust'tan gelen JSON parse edilir
|
||
const languageInfo = JSON.parse(jsonFromRust);
|
||
|
||
const extensions = [basicSetup, dexpr(languageInfo)];
|
||
```
|
||
|
||
Detaylar için: [Editor Modülü](editor.md)
|