Colle du Rust à gauche puis clique sur "Convertir" — on le transforme en XMLColle du code Rust

Ce que fait cet outil

Si tu as déjà eu à écrire à la main du XML qui reproduit un struct Rust — pour un client SOAP dans un service d'intégration, un fichier de config système ou une fixture de test — tu sais à quel point c'est une corvée de copier-coller. Colle ton Rust ici et récupère du XML bien formé en un coup. Un struct unique, un fichier avec plusieurs structs et enums, ou un let order = Order { ... }; rempli — même résultat : un document XML complet avec chaque champ préservé.

Ce n'est pas du remplacement de string bête. Le convertisseur sait comment Rust sérialise réellement via serde — à peu près comme serde-xml-rs ou quick-xml l'émettraient. f64 et f32 sortent en texte numérique brut, les valeurs String sont échappées pour XML, un Option<T> avec None devient un élément vide (ou est sauté avec #[serde(skip_serializing_if = "Option::is_none")]), et Vec<T> suit une forme de conteneur cohérente — chaque Vec devient un élément wrapper avec un enfant par item, nommé d'après le type de l'élément.

Les attributs serde sont respectés. #[serde(rename = "x")] sur un champ renomme l'élément dans la sortie, #[serde(rename = "x")] sur le struct renomme le root englobant, #[serde(skip)] retire le champ et #[serde(flatten)] remonte un struct imbriqué d'un niveau. Les enums sont émis avec les règles de tagging standard de serde — externally-tagged par défaut, adjacently ou internally tagged si tu poses #[serde(tag = "...")]. Si tu veux la version en profondeur, The Rust Book est un bon point de départ pour l'ownership et le système de types dessous.

Comment l'utiliser

Trois étapes. Même fonctionnement que tu colles un struct de cinq lignes ou un module complet.

1

Colle ton Rust (ou essaie l'exemple)

Balance ton Rust dans l'éditeur de gauche tel quel. Un struct, un enum, un struct littéral rempli, ou un fichier avec plusieurs types — tout passe. Clique sur Charger un exemple si tu veux voir un cas réaliste d'abord.

Pas besoin d'enlever les use, les derive ou les annotations de lifetime. Laisse le code tel que rustfmt l'a laissé. Colle, c'est tout.

2

Clique sur Convertir

Clique sur le bouton vert Convertir. L'outil lit le Rust, conserve chaque struct et chaque champ, et construit le XML en un coup. Un petit indicateur de chargement tourne pendant le traitement.

3

Copie le XML

Le panneau de droite se remplit de XML indenté et bien formé qu'un parser XML conforme acceptera. Copie-le direct dans ta requête SOAP, ton fichier de config ou ta fixture de test.

Quand ça sert vraiment

Intégration SOAP niveau système

Les services Rust cohabitent souvent avec des systèmes legacy qui parlent encore SOAP. Colle ton struct de requête, récupère le corps XML, teste-le dans SoapUI avant de câbler le client HTTP — plus rapide que d'écrire l'envelope à la main. Combine avec un crate de <a href="https://crates.io/" target="_blank" rel="noopener">crates.io</a> comme <code>reqwest</code> pour le transport.

Fichiers de config pour services et daemons

Un struct settings avec plus de 30 champs devient un template XML prêt à éditer. Pas de boilerplate manuel, pas de champs oubliés quand le struct grossit.

Seed de fixtures de test

Transforme un <code>let order = Order { ... };</code> rempli d'un test unitaire en fichier XML de seed pour des tests d'intégration, des mock servers ou des systèmes legacy que tu ne possèdes pas.

Doc qui reste à jour

Génère des exemples XML pour un README, les docs de crate ou une doc de schéma XSD directement depuis tes vrais structs, pour que la doc colle au code au lieu de dériver.

Questions fréquentes

Je peux coller plusieurs structs d'un coup ?

Oui — colle un module entier. Chaque struct ou enum de niveau supérieur sort avec les types imbriqués expandus et les valeurs par défaut remplies. Rien n'est jeté en silence.

Il respecte #[serde(rename)] et #[serde(skip)] ?

Oui. #[serde(rename = "x")] sur un champ renomme l'élément XML, #[serde(rename = "x")] sur le struct renomme le root englobant, #[serde(skip)] retire le champ entièrement et #[serde(flatten)] remonte un struct imbriqué d'un niveau. #[serde(rename_all = "PascalCase")] s'applique à tous les champs du struct. C'est conforme à ce que serde fait réellement en runtime.

Comment Option<T> et skip_serializing_if sont gérés ?

Un None devient un élément vide par défaut — ainsi la forme reste cohérente et les XSD continuent de valider. Si le champ a #[serde(skip_serializing_if = "Option::is_none")], les None sont retirés. Some(x) est toujours sérialisé comme x lui-même.

Et les enums, Vec et HashMap ?

Les enums sortent par défaut en externally-tagged (<VariantName>...</VariantName>) ; ajoute #[serde(tag = "type")] pour passer en internally-tagged. Vec<T> devient un élément conteneur avec un enfant par item, nommé d'après le type — un Vec<OrderItem> items donne <items><OrderItem/><OrderItem/></items>. HashMap<K,V> devient un conteneur de <Entry><Key/><Value/></Entry>.

Mon code est-il stocké ?

Ton code est envoyé au backend pour la conversion et n'est pas conservé — on ne log pas le payload. Comme toujours avec les outils en ligne, si le code est vraiment sensible, relis-le avant de le coller.

Et si le Rust utilise des lifetimes, des traits ou des blocs unsafe ?

Les annotations de lifetime sont ignorées pour XML — elles n'affectent pas la valeur en runtime. Les définitions de trait décrivent la forme, pas le contenu, donc elles ne produisent pas de XML directement ; les structs qui les implémentent oui. Les blocs unsafe sont ignorés car c'est une construction d'exécution. Si le code a des erreurs de syntaxe, corrige les évidentes en premier — le parser est tolérant mais pas voyant.

Autres outils qui peuvent te servir

Rust vers XML n'est qu'une pièce du puzzle. Ceux-ci se combinent bien :