An attempt to transform an asyncapi spec to a target schema.
Ideally this should:
- parse an asyncapi spec, available in the
"com.al333z" %% "asyncapi-gen-core" % "x.y.z"
dependency - be able to generate the schema for the models in:
-
protobuf
: able to output a .proto file content, available in the"com.al333z" %% "asyncapi-gen-protobuf" % "x.y.z"
dependency -
json
-
avro
-
- be able to generate the scala code for the models (models, serdes)
-
protobuf
: done viascalapb
, available in the"com.al333z" %% "asyncapi-gen-protobuf" % "x.y.z"
dependency -
json
-
avro
-
- be able to offer a set of utils which will simplify the consumer/producer client code (e.g. serdes, ...) for various broker/formats:
-
kafka/protobuf
, available in the"com.al333z" %% "asyncapi-gen-kafka" % "x.y.z"
dependency
-
This can be useful if in your organization there's a definition-first approach to define event-streaming platforms.
You can attach this codegen tool to a PR merge, commit or any relevant event of your event definition lifecycle, so that the events configured will auto-magically be transformed in all the sources needed from consumer/producer applications. After the generation, a good approach would be to actually tag the generated artifacts with a version and upload to a registry.
The reason behind this is that we should only be defining our contracts once, and let the machine generate the low level details such as value classes, serdes, etc.
- Check and run the main in
protobuf-kafka-example/src/main/scala/gen/Gen.scala
. This will generate the schema (.proto
) and the sources (java
andscala
) for the models and for the serdes, and will return aTopics
companion object which will offer the user a nice way to consume/produce from/to a configured topic (e.g.user_events
).
object Topics {
def userEvents: Topic[Int, gen.UserSignedUp] = ???
// ...
}
- run
docker-compose -f "protobuf-kafka-example/docker-compose.yml" up
, to turn on locally a working kafka env. - To see how the generated sources can be used, uncomment and run the
SampleConsumer.scala
andSampleProducer.scala
. - You should see messages flowing, and thus, everything just working (de/serialization, topic consumption/production, etc...).
NB: the example here is not how you should use this tool. See Rationale section for a more principled approach.
No docs provided yet. The best things you can do to see how it works is checking/playing with tests.