Convertitore Rust a XML
Incolla struct Rust o un literal di struct. Ricevi XML pulito al volo.
Cosa fa questo strumento
Se ti è mai toccato scrivere a mano XML che rispecchia uno struct Rust — per un client SOAP in un servizio di integrazione, un file di configurazione di sistema o una fixture di test — sai quanto copia-incolla comporta. Incolla il Rust qui e ricevi XML ben formato in una sola passata. Un singolo struct, un file con diversi struct ed enum, o un let order = Order { ... }; già popolato — stesso risultato: un documento XML completo con ogni campo preservato.
Non è una sostituzione stupida di stringhe. Il convertitore sa come Rust serializza davvero tramite serde — più o meno come lo emetterebbero serde-xml-rs o quick-xml. f64 e f32 escono come testo numerico semplice, i valori String vengono escapati per XML, Option<T> con None diventa un elemento vuoto (o viene saltato se è impostato #[serde(skip_serializing_if = "Option::is_none")]), e Vec<T> segue una forma di container coerente — ogni Vec diventa un elemento wrapper con un figlio per item, chiamato in base al tipo dell'elemento.
Gli attributi di serde vengono rispettati. #[serde(rename = "x")] su un campo rinomina l'elemento in output, #[serde(rename = "x")] sullo struct rinomina il root di avvolgimento, #[serde(skip)] scarta il campo, e #[serde(flatten)] tira su uno struct annidato di un livello. Gli enum vengono emessi con le regole di tagging standard di serde — externally tagged di default, adjacently o internally tagged se imposti #[serde(tag = "...")]. Se vuoi la versione approfondita, The Rust Book è un solido punto di partenza per ownership e il sistema di tipi sottostante.
Come si usa
Tre passi. Funziona uguale sia che incolli uno struct da cinque righe sia un modulo completo.
Incolla il tuo Rust (o prova l'esempio)
Butta il Rust nell'editor di sinistra così com'è. Uno struct, un enum, un literal di struct popolato, o un file con più tipi — va tutto bene. Clicca su Carica esempio se vuoi prima vedere un caso realistico.
Non serve togliere gli use, rimuovere i derive o ripulire le annotazioni di lifetime. Lascia il codice come lo ha lasciato rustfmt. Incolla e basta.
Clicca su Converti
Clicca sul bottone verde Converti. Lo strumento legge il Rust, preserva ogni struct e ogni campo, e costruisce l'XML in una passata. Mentre gira vedi un piccolo indicatore di caricamento.
Copia l'XML
Il pannello di destra si riempie di XML indentato e ben formato che qualsiasi parser XML conforme allo standard accetta. Copialo direttamente nella tua richiesta SOAP, nel file di config o nella fixture di test.
Quando serve davvero
Integrazione SOAP a livello di sistema
I servizi Rust spesso convivono con sistemi legacy che ancora parlano SOAP. Incolla lo struct della richiesta, prendi il body XML, testalo in SoapUI prima di cablare il client HTTP — più veloce che scrivere l'envelope a mano. Combina con un crate da <a href="https://crates.io/" target="_blank" rel="noopener">crates.io</a> come <code>reqwest</code> per il trasporto.
File di config per servizi e daemon
Uno struct di settings con 30+ campi diventa un template XML pronto da modificare. Niente boilerplate scritto a mano, niente campi dimenticati quando lo struct cresce.
Seed di fixture di test
Trasforma un <code>let order = Order { ... };</code> popolato da uno unit test in un file XML di seed per test di integrazione, mock server o sistemi legacy che non possiedi.
Mantenere la doc allineata
Genera esempi XML per un README, docs di crate o documentazione di schema basata su XSD direttamente dai tuoi veri struct, così la doc combacia con il codice invece di divergere.
Domande frequenti
Posso incollare più struct in una volta?
Sì — incolla un intero modulo. Ogni struct o enum di livello superiore esce con i tipi annidati espansi e i valori di default riempiti. Niente viene scartato in silenzio.
Rispetta #[serde(rename)] e #[serde(skip)]?
Sì. #[serde(rename = "x")] su un campo rinomina l'elemento XML, #[serde(rename = "x")] sullo struct rinomina il root di avvolgimento, #[serde(skip)] scarta il campo del tutto, e #[serde(flatten)] tira su uno struct annidato di un livello. #[serde(rename_all = "PascalCase")] viene applicato a ogni campo dello struct. È la stessa cosa che serde fa davvero a runtime.
Come gestisce Option<T> e skip_serializing_if?
Un valore None diventa un elemento vuoto di default — così la forma resta coerente e gli XSD continuano a validare. Se il campo ha #[serde(skip_serializing_if = "Option::is_none")], i valori None vengono scartati del tutto. Some(x) viene sempre serializzato come x stesso.
E gli enum, Vec e HashMap?
Gli enum di default sono externally-tagged (<VariantName>...</VariantName>); aggiungi #[serde(tag = "type")] per passare a internally-tagged. Vec<T> diventa un elemento container con un figlio per item, chiamato in base al tipo — un Vec<OrderItem> items diventa <items><OrderItem/><OrderItem/></items>. HashMap<K,V> diventa un container di <Entry><Key/><Value/></Entry>.
Il mio codice viene memorizzato?
Il tuo codice viene inviato al backend per la conversione e non viene persistito — non logghiamo il payload. Come sempre con gli strumenti online, se il codice è davvero sensibile, dagli un'occhiata prima di incollarlo.
E se il Rust usa lifetime, trait o blocchi unsafe?
Le annotazioni di lifetime vengono rimosse ai fini dell'XML — non influenzano il valore a runtime. Le definizioni di trait descrivono la forma, non il contenuto, quindi non producono XML direttamente; gli struct che le implementano sì. I blocchi unsafe vengono ignorati perché sono costrutti di tempo di esecuzione. Se il codice ha errori di sintassi, sistema prima quelli ovvi — il parser è tollerante ma non è un veggente.
Altri strumenti che potrebbero servirti
Rust a XML è un pezzo del puzzle. Questi ci si abbinano bene: