Skip to content

state-machine-systems/protokruft

 
 

Repository files navigation

coverage kotlin build status bintray version

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.

What does it do?

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"
        }
    }

Use it:

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

About

Generate a DSL to hide all the hideous ProtocolBuffer boilerplate

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Kotlin 99.1%
  • Shell 0.9%