Kafka protocol library for Erlang/Elixir

This is a kafka wire format encode/decode library, not a kafka client. See https://github.com/klarna/brod for kafka client implementation.

Code generated from org.apache.kafka.common.protocol.Protocol.

How to generate priv/kafka.bnf

Ensure you have JDK (1.7+) and gradle (2.0+) installed. Change kafka version in priv/kafka_protocol_bnf/build.gradle if needed.

make kafka-bnf

How to generate src/kafka_schema.erl

make gen-code

Schema explained

Take produce_request for example

get(produce_request, V) when V >= 0, V =< 2 ->
[{acks,int16},
{timeout,int32},
{topic_data,{array,[{topic,string},
{data,{array,[{partition,int32},
{record_set,records}]}}]}}];

It is generated from below BNF block.

ProduceRequestV0 => acks timeout [topic_data]
acks => INT16
timeout => INT32
topic_data => topic [data]
topic => STRING
data => partition record_set
partition => INT32
record_set => RECORDS

The root level schema is always a struct.

A struct consists of fields having lower level schema which can be another struct, an array or a primitive.