Entrada (esquema .proto)

Saída (Kotlin)

O que esta ferramenta faz

Você tem um esquema Protocol Buffers — talvez do time de backend, talvez do contrato de uma API de terceiros — e uma codebase Kotlin que precisa de formas tipadas correspondentes. Pode ser um app Android falando com um backend gRPC, ou Kotlin do lado do servidor parseando mensagens Protobuf codificadas em JSON. Montar o pipeline completo de codegen do grpc-kotlin é exagero quando você só quer as formas das data class — cole, copie e jogue dentro.

O mapeamento de tipos segue os idiomas Kotlin: stringString, boolBoolean, bytesByteArray, int32/sint32/fixed32Int, int64/sint64/fixed64Long, doubleDouble, floatFloat. repeated T vira List<T> com padrão emptyList(); map<K, V> vira Map<K, V> com padrão emptyMap(). Campos de mensagem aninhada singulares são anuláveis (?) com padrão null — bate com a semântica has-value do proto3.

Os nomes de campo são convertidos de snake_case no proto para camelCase em Kotlin (order_idorderId) — a convenção padrão de codificação Kotlin segundo o estilo oficial Kotlin. Nomes de classe e enum permanecem em PascalCase. Cada enum vira uma enum class com um Int de respaldo. A conversão roda inteira no seu navegador — seu .proto nunca sai da página.

Como usar

Três passos. A saída é Kotlin pronto para colar.

1

Cole seu esquema .proto

Solte o esquema no editor da esquerda. syntax = "proto3"; no topo é ok mas opcional. Blocos message aninhados, declarações enum, oneof, map<K, V> e opções de campo são todos tratados.

As convenções de código Kotlin preferem camelCase para propriedades — o conversor faz isso por você. Se preferir os nomes originais em snake_case (algumas bibliotecas de serialização exigem nomes de campo idênticos), use buscar-substituir na saída.

2

Leia a saída Kotlin

À direita: cada mensagem vira uma data class com valores padrão para cada propriedade. Cada enum vira uma enum class(val value: Int) para você fazer round-trip do formato wire. Apenas no nível raiz (sem aninhamento) — fácil de jogar num arquivo só ou de quebrar em vários.

3

Encaixe no seu projeto

Solte o arquivo no seu projeto, adicione uma declaração package e importe. Para código gRPC de verdade no Android ou na JVM você ainda vai querer rodar o codegen do grpc-kotlin para ter os métodos de marshal e os stubs. Esta saída serve para tratamento de JSON tipado, esboços de struct e revisões.

Quando isso realmente economiza tempo

Esboçar tipos Android a partir de um .proto do backend

Seu app Android conversa com um backend gRPC. O time de backend é dono do .proto. Você quer as formas de data class para tipar seus view models sem montar codegen ainda. Cole, jogue em Models.kt, está tipado.

Kotlin do lado do servidor parseando Protobuf codificado em JSON

Seu Kotlin do lado do servidor (Ktor / Spring Boot) consome JSON que segue a codificação JSON do proto3. Você precisa de data classes que casem. Cole o .proto, copie a saída Kotlin e plugue no serializador da sua escolha.

Revisar uma mudança de API Protobuf

Um colega de time adicionou campos a uma mensagem. Cole o novo .proto, faça diff da saída Kotlin contra seu Models.kt atual e deixe uma revisão focada sem subir a toolchain inteira.

Scripts pontuais e protótipos rápidos

Um script Kotlin de 50 linhas que bate num gRPC-gateway. Configurar grpc-kotlin e protoc só pra isso é exagero. Gere as data classes aqui e jogue dentro.

Perguntas comuns

Isso substitui o protoc-gen-kotlin?

Não. O codegen real produz métodos marshal/unmarshal, descriptors e os stubs gRPC. Esta ferramenta só emite as formas de data class. Rode o grpc-kotlin para código gRPC de produção. Use isto para esboços, parse de JSON, revisões e scripts pontuais.

Por que campos de mensagem singulares são anuláveis?

No proto3, campos de tipo mensagem têm semântica de "has value" — podem estar não definidos. O equivalente Kotlin mais limpo é uma propriedade anulável com padrão null. Se você sabe que seus dados sempre preenchem esses campos, tire o ? e o padrão — buscar-substituir direto.

Como uint32 e uint64 são tratados?

Ambos mapeiam para tipos com sinal (Int e Long). O Kotlin tem tipos UInt e ULong estáveis desde a 1.5, mas os tipos com sinal têm mais compatibilidade com bibliotecas de serialização existentes e com a maior parte das codebases Android. Se você precisa especificamente das variantes sem sinal, troque na saída.

Como os enums são emitidos?

Cada um vira uma enum class WithValue(val value: Int) para você preservar o inteiro do formato wire. Cada valor recebe o nome original do proto (ex.: ORDER_STATUS_PENDING) — entradas de enum em Kotlin são convencionalmente SCREAMING_SNAKE_CASE mesmo, então casa direitinho.

Como os nomes de campo são convertidos?

snake_casecamelCase conforme as convenções de codificação Kotlin. order_id vira orderId, customer_name vira customerName. Nomes de classe e enum permanecem em PascalCase como no proto.

Lida com mensagens aninhadas?

Sim — blocos message aninhados são achatados em declarações data class de nível raiz na saída. Isso mantém o arquivo fácil de ler e de quebrar em múltiplos arquivos. Se preferir classes aninhadas Kotlin, embrulhe à mão.

Ferramentas relacionadas

Se você trabalha com Protobuf e Kotlin, estas combinam bem: