Protokruft is a simple Gradle plugin for generating a Kotlin DSL from generated Java Protobuf message source. It removes the worst of the Java boilerplate that is generated, leaving you with a nice clean syntax in your Kotlin. The target classes are those which extend GeneratedMessageV3
. By default, the generated classes are put next to the Java files, into the build/generated/source/proto/main/java
folder.
Given this proto:
syntax = "proto3";
option java_package = "org.protokruft.example1";
package AnExample1;
message Car {
string model = 1;
Engine engine = 2;
}
message Engine {
int32 cc = 1;
int32 bhp = 2;
}
The generated Java code from the Google protoc would be used like this:
val person = Person.newBuilder()
.setName("Hello Kitty")
.setAddress(
Address.newBuilder()
.setNumber(123)
.setStreet("Hello Kitty Street")
.setPostcode("N304SD")
.build())
.build()
Sprinkle on some Protokruft, and you can use it like this to hide the newBuilder().build()
boilerplate:
val person = newPerson {
name = "Hello Kitty"
address = newAddress {
number = 123
street = "Hello Kitty Street"
postcode = "N304SD"
}
}
... or like this to scope the Builder
as it
:
val personScoped = newPerson.also {
it.name = "Hello Kitty"
it.address = newAddress.also {
it.number = 123
it.street = "Hello Kitty Street"
it.postcode = "N304SD"
}
}
Merge the following sections into your Gradle file. This assumes that you've already got Protobuf classes being generated by the protobuf-gradle-plugin
:
buildscript {
dependencies {
classpath 'org.protokruft:protokruft:0.0.8'
}
}
repositories {
jcenter()
}
apply plugin: 'protokruft'
protokruft {
packageNames = ["com.mygreatpackage"] // "*" by default
outputClassFile = "myCustomFile" // "messageDsl" by default
}
// allows you to just run generateProtoDsl
generateProtobufDsl.dependsOn('generateProto')
Then just run: ./gradlew generateProtobufDsl