Cole Rust à esquerda e clique em "Converter" — transformamos em XMLCole código Rust

O que esta ferramenta faz

Se você já teve que escrever à mão XML que espelha um struct de Rust — para um cliente SOAP em um serviço de integração, um arquivo de config de sistema ou uma fixture de teste — sabe quanto copia-e-cola isso envolve. Cole o Rust aqui e recebe XML bem-formado de uma passada só. Um único struct, um arquivo com vários structs e enums, ou um let order = Order { ... }; já preenchido — mesmo resultado: um documento XML completo com cada campo preservado.

Não é substituição boba de strings. O conversor sabe como Rust realmente serializa via serde — basicamente do jeito que serde-xml-rs ou quick-xml emitiriam. f64 e f32 saem como texto numérico simples, valores String são escapados para XML, Option<T> com None vira um elemento vazio (ou é pulado com #[serde(skip_serializing_if = "Option::is_none")]), e Vec<T> segue uma forma de contêiner consistente — cada Vec vira um elemento wrapper com um filho por item, nomeado conforme o tipo do elemento.

Os atributos de serde são respeitados. #[serde(rename = "x")] num campo renomeia o elemento na saída, #[serde(rename = "x")] no struct renomeia o root que envolve, #[serde(skip)] descarta o campo e #[serde(flatten)] sobe um struct aninhado um nível. Enums são emitidos com as regras de tagging padrão do serde — externally-tagged por padrão, adjacently ou internally tagged se você setar #[serde(tag = "...")]. Se quiser a versão mais profunda, The Rust Book é um bom ponto de partida para entender ownership e o sistema de tipos por baixo.

Como usar

Três passos. Funciona igual se você cola um struct de cinco linhas ou um módulo inteiro.

1

Cole seu Rust (ou tente o exemplo)

Jogue o Rust no editor da esquerda como está. Um struct, um enum, um struct literal preenchido, ou um arquivo com vários tipos — tudo funciona. Clique em Carregar exemplo se quiser ver um caso realista primeiro.

Não precisa tirar os use, remover macros de derive ou limpar anotações de lifetime. Deixe o código do jeito que o rustfmt deixou. Só cole.

2

Clique em Converter

Clique no botão verde Converter. A ferramenta lê o Rust, preserva cada struct e campo, e constrói o XML de uma passada. Um pequeno indicador de loading aparece enquanto roda.

3

Copie o XML

O painel da direita se enche de XML indentado e bem-formado que qualquer parser XML compatível aceita. Cole direto na sua requisição SOAP, arquivo de config ou fixture de teste.

Quando isso realmente ajuda

Integração SOAP em nível de sistema

Serviços Rust frequentemente ficam ao lado de sistemas legados que ainda falam SOAP. Cole seu struct de request, pegue o corpo XML, teste no SoapUI antes de ligar o cliente HTTP — mais rápido que escrever o envelope à mão. Combine com um crate de <a href="https://crates.io/" target="_blank" rel="noopener">crates.io</a> como <code>reqwest</code> para o transporte.

Arquivos de config para serviços e daemons

Um struct de configurações com 30+ campos vira um template XML pronto para editar. Sem boilerplate escrito à mão, sem campos esquecidos quando o struct cresce.

Semeando fixtures de teste

Transforme um <code>let order = Order { ... };</code> preenchido de um teste unitário em um arquivo XML de seed para testes de integração, mock servers ou sistemas legados que você não controla.

Mantendo a documentação em sincronia

Gere exemplos XML para README, docs de crate ou documentação de schema com XSD direto dos seus structs reais, para que a documentação bata com o código em vez de divergir.

Perguntas frequentes

Posso colar vários structs de uma vez?

Sim — cole um módulo inteiro. Cada struct ou enum de nível superior sai com os tipos aninhados expandidos e valores padrão preenchidos. Nada é descartado silenciosamente.

Respeita #[serde(rename)] e #[serde(skip)]?

Sim. #[serde(rename = "x")] num campo renomeia o elemento XML, #[serde(rename = "x")] no struct renomeia o root que envolve, #[serde(skip)] descarta o campo inteiro e #[serde(flatten)] sobe um struct aninhado um nível. #[serde(rename_all = "PascalCase")] é aplicado a todos os campos do struct. Isso bate com o que o serde faz em runtime.

Como trata Option<T> e skip_serializing_if?

Um valor None vira um elemento vazio por padrão — assim a forma fica consistente e os XSDs continuam validando. Se o campo tem #[serde(skip_serializing_if = "Option::is_none")], valores None são descartados inteiramente. Some(x) é sempre serializado como o próprio x.

E os enums, Vec e HashMap?

Enums por padrão são externally-tagged (<VariantName>...</VariantName>); adicione #[serde(tag = "type")] para alternar para internally-tagged. Vec<T> vira um elemento contêiner com um filho por item, nomeado pelo tipo — um Vec<OrderItem> items vira <items><OrderItem/><OrderItem/></items>. HashMap<K,V> vira um contêiner de <Entry><Key/><Value/></Entry>.

Meu código é armazenado?

Seu código é enviado ao backend para a conversão e não é persistido — não logamos o payload. Como sempre com ferramentas online, se o código é realmente sensível, dê uma revisada antes de colar.

E se o Rust tem lifetimes, traits ou blocos unsafe?

Anotações de lifetime são removidas para fins de XML — elas não afetam o valor em runtime. Definições de trait descrevem forma, não conteúdo, então não produzem XML diretamente; os structs que implementam produzem. Blocos unsafe são ignorados porque são construções de tempo de execução. Se o código tem erros de sintaxe, conserte os óbvios primeiro — o parser é tolerante, mas não adivinho.

Outras ferramentas que podem ajudar

Rust para XML é uma peça do quebra-cabeça. Estas combinam bem: