README.md

# franz

[![Package Version](https://img.shields.io/hexpm/v/franz)](https://hex.pm/packages/franz)
[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/franz/)

`franz` is a Gleam library for interacting with Kafka. It provides functionalities to produce and consume messages, handle topics, and manage configurations.

## Installation

Add `franz` to your Gleam project:

```sh
gleam add franz
```

## Usage

```gleam
  import franz
  import franz/consumer_config
  import franz/group_config
  import franz/group_subscriber
  import franz/message_type
  import franz/partitions
  import franz/producer
  import franz/topic_subscriber
  import gleam/io

  pub fn main() {
    let topic = "gleamy_topic"
    let endpoint = #("localhost", 9092)
    let assert Ok(connection) =
      franz.new_client([endpoint])
      |> franz.with_config(franz.AutoStartProducers(True))
      |> franz.start()

    //let assert Ok(Nil) = franz.create_topic([endpoint], topic, 1, 1)

    let assert Ok(Nil) =
      producer.produce_sync(
        connection,
        topic,
        producer.Partitioner(producer.Random),
        <<"gracias">>,
        producer.Value(<<"bitte">>, [#("meta", "data")]),
      )

    let counter = 0
    let assert Ok(_pid) =
      group_subscriber.new(
        connection,
        "group",
        [topic],
        message_type.Message,
        fn(message, counter) {
          io.debug(message)
          io.debug(counter)
          group_subscriber.commit(counter + 1)
        },
        counter,
      )
      |> group_subscriber.with_group_config(
        group_config.OffsetCommitIntervalSeconds(10),
      )
      |> group_subscriber.with_consumer_config(consumer_config.BeginOffset(
        consumer_config.Earliest,
      ))
      |> group_subscriber.start()

    let assert Ok(_pid) =
      topic_subscriber.new(
        connection,
        topic,
        partitions.All,
        message_type.Message,
        fn(_, message, state) {
          io.debug(message)
          topic_subscriber.ack(state)
        },
        Nil,
      )
      |> topic_subscriber.with_config(consumer_config.BeginOffset(
        consumer_config.Earliest,
      ))
      |> topic_subscriber.start()
  }
```