Rust'tan XML'e Dönüştürücü
Rust struct veya struct literal yapıştır. Temiz XML al.
Bu araç ne yapar
Eğer bir entegrasyon servisindeki SOAP istemcisi, bir sistem config dosyası ya da bir test fixture’ı için bir Rust struct’ını yansıtan XML’i elle yazmak zorunda kaldıysan, bunun ne kadar çok kopyala-yapıştır gerektirdiğini bilirsin. Rust’ı buraya yapıştır, tek seferde iyi biçimlenmiş XML al. Tek bir struct, birkaç struct ve enum içeren bir dosya, ya da doldurulmuş bir let order = Order { ... }; literali — sonuç aynı: her alanın korunduğu eksiksiz bir XML dokümanı.
Aptal bir string değiştirme değil. Dönüştürücü, Rust’ın serde üzerinden gerçekte nasıl serileştirdiğini biliyor — aşağı yukarı serde-xml-rs veya quick-xml’in üreteceği biçimde. f64 ve f32 düz sayısal metin olarak çıkar, String değerleri XML’e escape edilir, None içeren Option<T> boş bir eleman olur (ya da #[serde(skip_serializing_if = "Option::is_none")] ayarlıysa atlanır) ve Vec<T> tutarlı bir container biçimi izler — her Vec, eleman tipinin adını taşıyan ve her öğe için bir çocuk içeren bir wrapper elemana dönüşür.
Serde özellikleri (attribute) dikkate alınır. Bir alandaki #[serde(rename = "x")] çıktıdaki elemanın adını değiştirir, struct üzerindeki #[serde(rename = "x")] saran kök elemanın adını değiştirir, #[serde(skip)] alanı düşürür ve #[serde(flatten)] iç içe struct’ı bir seviye yukarı çeker. Enum’lar, serde’nin standart tagging kurallarıyla üretilir — varsayılan olarak externally tagged, #[serde(tag = "...")] koyarsan adjacently veya internally tagged olur. Derinlemesine versiyonu istiyorsan, altta yatan ownership ve tip sistemini anlamak için The Rust Book sağlam bir başlangıç noktasıdır.
Nasıl kullanılır
Üç adım. Beş satırlık bir struct da yapıştırsan, tam bir modül de yapıştırsan aynı şekilde çalışır.
Rust’ını yapıştır (ya da örneği dene)
Rust kodunu olduğu gibi soldaki editöre bırak. Bir struct, bir enum, doldurulmuş bir struct literali, ya da birden çok tip içeren bir dosya — hepsi olur. Önce gerçekçi bir örnek görmek istersen Örnek Yükle’ye tıkla.
use ifadelerini söküp atmana, derive makrolarını kaldırmana veya lifetime anotasyonlarını temizlemene gerek yok. Kodu rustfmt’ın bıraktığı gibi bırak. Sadece yapıştır.
Dönüştür’e bas
Yeşil Dönüştür butonuna tıkla. Araç Rust’ı okur, her struct’ı ve her alanı korur ve XML’i tek seferde inşa eder. Çalışırken kısa bir yükleme göstergesi görürsün.
XML’i kopyala
Sağdaki panel, standartlara uygun herhangi bir XML parser’ının kabul edeceği girintili ve iyi biçimlenmiş XML ile dolar. Doğrudan SOAP isteğine, config dosyasına veya test fixture’ına yapıştır.
Gerçekten işe yaradığı yerler
Sistem düzeyinde SOAP entegrasyonu
Rust servisleri çoğu zaman hâlâ SOAP konuşan eski sistemlerin yanında durur. Request struct’ını yapıştır, XML gövdesini al, HTTP istemcisini bağlamadan önce SoapUI’da test et — envelope’ı elle yazmaktan daha hızlı. Taşıma için <a href="https://crates.io/" target="_blank" rel="noopener">crates.io</a>’dan <code>reqwest</code> gibi bir crate ile birleştir.
Servisler ve daemon’lar için config dosyaları
30+ alanı olan bir settings struct’ı düzenlemeye hazır bir XML şablonuna dönüşür. Elle yazılmış boilerplate yok, struct büyüdüğünde atlanmış alan yok.
Test fixture’larını beslemek
Bir unit testteki doldurulmuş <code>let order = Order { ... };</code>’ı entegrasyon testleri, mock server’lar veya sahibi olmadığın eski sistemler için XML seed dosyasına çevir.
Dokümantasyonu güncel tutmak
README, crate dokümanı veya XSD destekli şema dokümantasyonu için XML örneklerini doğrudan gerçek struct’larından üret; böylece dokümanlar koddan sapmak yerine kodla eşleşir.
Sık sorulan sorular
Birden fazla struct’ı aynı anda yapıştırabilir miyim?
Evet — bütün bir modülü yapıştır. Her üst seviye struct veya enum, iç tipleri açılmış ve varsayılan değerleri doldurulmuş halde çıkar. Hiçbir şey sessizce atılmaz.
#[serde(rename)] ve #[serde(skip)]’i dikkate alıyor mu?
Evet. Bir alandaki #[serde(rename = "x")] XML elemanını yeniden adlandırır, struct üzerindeki #[serde(rename = "x")] saran kök elemanı yeniden adlandırır, #[serde(skip)] alanı tamamen düşürür ve #[serde(flatten)] iç içe struct’ı bir seviye yukarı çeker. #[serde(rename_all = "PascalCase")] struct içindeki her alana uygulanır. Bu, serde’nin çalışma zamanında gerçekten yaptığıyla aynı.
Option<T> ve skip_serializing_if nasıl işleniyor?
Varsayılan olarak bir None değeri boş bir elemana dönüşür — böylece biçim tutarlı kalır ve XSD’ler doğrulamaya devam eder. Alanda #[serde(skip_serializing_if = "Option::is_none")] varsa, None değerleri tamamen atılır. Some(x) her zaman x’in kendisi olarak serileştirilir.
Peki ya enum, Vec ve HashMap?
Enum’lar varsayılan olarak externally-tagged (<VariantName>...</VariantName>) olur; internally-tagged’a geçmek için #[serde(tag = "type")] ekle. Vec<T>, her öğe için bir çocuk içeren, eleman tipinin adını taşıyan bir container elemana dönüşür — bir Vec<OrderItem> items, <items><OrderItem/><OrderItem/></items> olur. HashMap<K,V> ise <Entry><Key/><Value/></Entry>’lerden oluşan bir container olur.
Kodum saklanıyor mu?
Kodun dönüştürme için backend’e gönderilir ve saklanmaz — payload’u loglamıyoruz. Online araçlarda her zaman geçerli olduğu gibi, kod gerçekten hassassa yapıştırmadan önce bir göz gezdir.
Rust’ta lifetime, trait veya unsafe blok varsa ne olur?
Lifetime anotasyonları XML için söküp atılır — çalışma zamanı değerini etkilemezler. Trait tanımları biçimi tanımlar, içeriği değil; yani doğrudan XML üretmezler, onları uygulayan struct’lar üretir. Unsafe bloklar çalışma zamanına ait yapılar olduğu için yok sayılır. Kodda sözdizimi hataları varsa önce barizlerini düzelt — parser toleranslıdır ama medyum değil.
İhtiyacın olabilecek diğer araçlar
Rust’tan XML’e, yapbozun bir parçası. Şunlar onunla iyi gider: