Conversor Protobuf a Kotlin
Pega un esquema .proto. Obtén data classes de Kotlin con tipos correctos, campos en camelCase y valores por defecto.
Entrada (esquema .proto)
Salida (Kotlin)
Qué hace esta herramienta
Tienes un esquema de Protocol Buffers — quizá del equipo de backend, quizá del contrato de una API de terceros — y un código en Kotlin que necesita formas tipadas para él. O bien una app Android llamando a un backend gRPC, o Kotlin de servidor parseando mensajes Protobuf codificados como JSON. Montar el pipeline completo de codegen de grpc-kotlin es excesivo si solo quieres las formas de las data class — pega, copia, suelta.
El mapeo de tipos sigue las convenciones de Kotlin: string → String, bool → Boolean, bytes → ByteArray, int32/sint32/fixed32 → Int, int64/sint64/fixed64 → Long, double → Double, float → Float. repeated T se convierte en List<T> con default emptyList(); map<K, V> se convierte en Map<K, V> con default emptyMap(). Los campos de mensaje anidado singulares son anulables (?) con default null — encaja con la semántica has-value de proto3.
Los nombres de campo pasan de snake_case en el proto a camelCase en Kotlin (order_id → orderId) — la convención estándar de codificación de Kotlin según el estilo oficial de Kotlin. Los nombres de clase y enum se mantienen en PascalCase. Cada enum se convierte en una enum class con un Int de respaldo. La conversión se ejecuta entera en tu navegador — tu .proto nunca abandona la página.
Cómo usarla
Tres pasos. La salida es Kotlin listo para pegar.
Pega tu esquema .proto
Suelta el esquema en el editor de la izquierda. syntax = "proto3"; arriba está bien pero es opcional. Bloques message anidados, declaraciones enum, oneof, map<K, V> y opciones de campo se manejan todos.
Las convenciones de código de Kotlin prefieren camelCase para las propiedades — el conversor lo hace por ti. Si prefieres los nombres originales en snake_case (algunas librerías de serialización exigen nombres de campo idénticos), usa buscar-reemplazar en la salida.
Lee la salida en Kotlin
A la derecha: cada mensaje se convierte en una data class con valores por defecto para cada propiedad. Cada enum se convierte en una enum class(val value: Int) para que puedas hacer round-trip del formato wire. Solo nivel raíz (sin anidamiento) — fácil de meter en un archivo o de partir.
Engánchalo a tu proyecto
Mete el archivo en tu proyecto, añade una declaración de package e importa. Para código gRPC real en Android o la JVM seguirás queriendo ejecutar el codegen de grpc-kotlin para tener los métodos de marshalling y los stubs. Esta salida es para manejo de JSON tipado, esbozos de estructura y revisiones.
Cuándo te ahorra tiempo de verdad
Esbozar tipos Android desde un .proto del backend
Tu app Android habla con un backend gRPC. El equipo de backend es dueño del .proto. Quieres las formas de data class para tipar tus view models sin montar codegen aún. Pega, suelta en Models.kt, listo, ya tienes tipos.
Kotlin de servidor parseando Protobuf codificado como JSON
Tu Kotlin de servidor (Ktor / Spring Boot) consume JSON que sigue la codificación JSON de proto3. Necesitas data classes que coincidan. Pega el .proto, copia la salida Kotlin, enchúfalo a tu serializador favorito.
Revisar un cambio de API Protobuf
Un compañero añadió campos a un mensaje. Pega el nuevo .proto, haz diff de la salida Kotlin contra tu Models.kt actual, deja una review enfocada sin levantar el toolchain completo.
Scripts puntuales y prototipos rápidos
Un script Kotlin de 50 líneas que pega contra un gRPC-gateway. Montar grpc-kotlin y protoc solo para eso es excesivo. Genera las data classes aquí y mételas dentro.
Preguntas comunes
¿Esto sustituye a protoc-gen-kotlin?
No. El codegen real produce métodos marshal/unmarshal, descriptores y los stubs de gRPC. Esta herramienta solo emite las formas de data class. Ejecuta grpc-kotlin para código gRPC de producción. Usa esto para esbozos, parseo de JSON, revisiones y scripts puntuales.
¿Por qué los campos de mensaje singulares son anulables?
En proto3 los campos de tipo mensaje tienen semántica de "has value" — pueden estar sin asignar. El equivalente más limpio en Kotlin es una propiedad anulable con default null. Si sabes que tus datos siempre rellenan estos campos, quita el ? y el default — un buscar-reemplazar directo.
¿Cómo se manejan uint32 y uint64?
Ambos se mapean a tipos con signo (Int y Long). Kotlin tiene tipos estables UInt y ULong desde 1.5, pero los tipos con signo son más compatibles con las librerías de serialización existentes y la mayoría de codebases Android. Si específicamente necesitas las variantes sin signo, cámbialas en la salida.
¿Cómo se emiten los enums?
Cada uno se convierte en una enum class WithValue(val value: Int) para que puedas preservar el entero del formato wire. Cada valor recibe el nombre original del proto (p. ej. ORDER_STATUS_PENDING) — las entradas de enum en Kotlin ya van convencionalmente en SCREAMING_SNAKE_CASE, así que cuadra.
¿Cómo se convierten los nombres de campo?
snake_case → camelCase según las convenciones de codificación de Kotlin. order_id se convierte en orderId, customer_name en customerName. Los nombres de clase y enum se mantienen en PascalCase tal y como están en el proto.
¿Maneja mensajes anidados?
Sí — los bloques message anidados se aplanan a declaraciones data class de nivel superior en la salida. Eso mantiene el archivo fácil de leer y de partir en varios archivos. Si prefieres clases anidadas de Kotlin, envuélvelas a mano.
Herramientas relacionadas
Si trabajas con Protobuf y Kotlin, estas combinan bien: