{-# language BangPatterns #-}
{-# language NamedFieldPuns #-}
{-# language DataKinds #-}
{-# language DeriveFunctor #-}
{-# language DuplicateRecordFields #-}
{-# language FlexibleContexts #-}
{-# language GeneralizedNewtypeDeriving #-}
{-# language MultiParamTypeClasses #-}
{-# language OverloadedStrings #-}
{-# language PolyKinds #-}
{-# language RankNTypes #-}
{-# language TypeFamilies #-}
{-# language UnboxedTuples #-}
{-# language UndecidableInstances #-}

module Kafka.ListOffsets.Request.V7
  ( Request(..)
  , Topic(..)
  , Partition(..)
  , toChunks
  ) where

import Prelude hiding (id)

import Data.Primitive (SmallArray)
import Data.Int (Int8,Int32,Int64)
import Data.Text (Text)
import Data.Bytes.Builder (Builder)
import Data.Bytes.Chunks (Chunks)

import qualified Kafka.Builder as Builder

-- | Kafka List Offsets request V7.
data Request = Request
  { Request -> Int32
replicaId :: !Int32
  , Request -> Int8
isolationLevel :: !Int8
  , Request -> SmallArray Topic
topics :: !(SmallArray Topic)
  }

data Topic = Topic
  { Topic -> Text
name :: !Text
  , Topic -> SmallArray Partition
partitions :: !(SmallArray Partition)
  }

data Partition = Partition
  { Partition -> Int32
index :: !Int32
  , Partition -> Int32
currentLeaderEpoch :: !Int32
  , Partition -> Int64
timestamp :: !Int64
  }

toChunks :: Request -> Chunks
toChunks :: Request -> Chunks
toChunks = Int -> Builder -> Chunks
Builder.run Int
128 (Builder -> Chunks) -> (Request -> Builder) -> Request -> Chunks
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Builder
encode

encode :: Request -> Builder
encode :: Request -> Builder
encode Request{Int32
$sel:replicaId:Request :: Request -> Int32
replicaId :: Int32
replicaId,Int8
$sel:isolationLevel:Request :: Request -> Int8
isolationLevel :: Int8
isolationLevel,SmallArray Topic
$sel:topics:Request :: Request -> SmallArray Topic
topics :: SmallArray Topic
topics} =
  Int32 -> Builder
Builder.int32 Int32
replicaId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Int8 -> Builder
Builder.int8 Int8
isolationLevel
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  (Topic -> Builder) -> SmallArray Topic -> Builder
forall a. (a -> Builder) -> SmallArray a -> Builder
Builder.compactArray Topic -> Builder
encodeTopic SmallArray Topic
topics
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields

encodeTopic :: Topic -> Builder
encodeTopic :: Topic -> Builder
encodeTopic Topic{Text
$sel:name:Topic :: Topic -> Text
name :: Text
name,SmallArray Partition
$sel:partitions:Topic :: Topic -> SmallArray Partition
partitions :: SmallArray Partition
partitions} =
  Text -> Builder
Builder.compactString Text
name
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  (Partition -> Builder) -> SmallArray Partition -> Builder
forall a. (a -> Builder) -> SmallArray a -> Builder
Builder.compactArray Partition -> Builder
encodePartition SmallArray Partition
partitions
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields

encodePartition :: Partition -> Builder
encodePartition :: Partition -> Builder
encodePartition Partition{Int32
$sel:index:Partition :: Partition -> Int32
index :: Int32
index,Int32
$sel:currentLeaderEpoch:Partition :: Partition -> Int32
currentLeaderEpoch :: Int32
currentLeaderEpoch,Int64
$sel:timestamp:Partition :: Partition -> Int64
timestamp :: Int64
timestamp} =
  Int32 -> Builder
Builder.int32 Int32
index
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Int32 -> Builder
Builder.int32 Int32
currentLeaderEpoch
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Int64 -> Builder
Builder.int64 Int64
timestamp
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields