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

module Kafka.SyncGroup.Request.V5
  ( Request(..)
  , Assignment(..)
  , toChunks
  ) where

import Prelude hiding (id)

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

import qualified Kafka.Builder as Builder

-- | Kafka Sync Group request V5.
data Request = Request
  { Request -> Text
groupId :: !Text
    -- ^ The group identifier
  , Request -> Int32
generationId :: !Int32
  , Request -> Text
memberId :: !Text
  , Request -> Maybe Text
groupInstanceId :: !(Maybe Text)
    -- ^ Group instance id. See KIP-345. Null means that static membership
    -- is disabled.
  , Request -> Text
protocolType :: !Text
    -- ^ Almost always the string @consumer@.
  , Request -> Text
protocolName :: !Text
  , Request -> SmallArray Assignment
assignments :: !(SmallArray Assignment)
  }

data Assignment = Assignment
  { Assignment -> Text
memberId :: {-# UNPACK #-} !Text
  , Assignment -> Bytes
assignment :: {-# UNPACK #-} !Bytes
  } 

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
r =
     Text -> Builder
Builder.compactString Request
r.groupId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int32 -> Builder
Builder.int32 Request
r.generationId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
Builder.compactString Request
r.memberId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Maybe Text -> Builder
Builder.compactNullableString Request
r.groupInstanceId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
Builder.compactString Request
r.protocolType
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
Builder.compactString Request
r.protocolName
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (Assignment -> Builder) -> SmallArray Assignment -> Builder
forall a. (a -> Builder) -> SmallArray a -> Builder
Builder.compactArray Assignment -> Builder
encodeAssignment Request
r.assignments
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields

encodeAssignment :: Assignment -> Builder
encodeAssignment :: Assignment -> Builder
encodeAssignment Assignment
r =
     Text -> Builder
Builder.compactString Assignment
r.memberId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Bytes -> Builder
Builder.compactBytes Assignment
r.assignment
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields