{-# 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.JoinGroup.Request.V9
  ( Request(..)
  , Protocol(..)
  , toChunks
  ) where

import Prelude hiding (id)

import Data.Int (Int16,Int32)
import Data.Bytes (Bytes)
import Data.Text (Text)
import Data.Bytes.Builder (Builder)
import Data.Bytes.Chunks (Chunks)
import Data.WideWord (Word128)
import Data.Primitive (SmallArray)

import qualified Kafka.Builder as Builder

-- | Kafka Join Group request V9.
data Request = Request
  { Request -> Text
groupId :: !Text
    -- ^ The group identifier
  , Request -> Int32
sessionTimeoutMilliseconds :: !Int32
  , Request -> Int32
rebalanceTimeoutMilliseconds :: !Int32
  , Request -> Text
memberId :: !Text
  , Request -> Maybe Text
groupInstanceId :: !(Maybe Text)
    -- ^ Group instance id. See KIP-345. Null means that this static membership
    -- is disabled. The empty string (known as UNKNOWN_MEMBER_ID) means that
    -- the broker picks a group instance id returns it.
  , Request -> Text
protocolType :: !Text
    -- ^ Almost always the string @consumer@.
  , Request -> SmallArray Protocol
protocols :: !(SmallArray Protocol)
  , Request -> Text
reason :: !Text
    -- ^ We do not allow null.
  }

data Protocol = Protocol
  { Protocol -> Text
name :: {-# UNPACK #-} !Text
  , Protocol -> Bytes
metadata :: {-# 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.sessionTimeoutMilliseconds
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int32 -> Builder
Builder.int32 Request
r.rebalanceTimeoutMilliseconds
  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
<> (Protocol -> Builder) -> SmallArray Protocol -> Builder
forall a. (a -> Builder) -> SmallArray a -> Builder
Builder.compactArray Protocol -> Builder
encodeProtocol Request
r.protocols
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
Builder.compactString Request
r.reason
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields

encodeProtocol :: Protocol -> Builder
encodeProtocol :: Protocol -> Builder
encodeProtocol Protocol{Text
$sel:name:Protocol :: Protocol -> Text
name :: Text
name,Bytes
$sel:metadata:Protocol :: Protocol -> Bytes
metadata :: Bytes
metadata} =
     Text -> Builder
Builder.compactString Text
name
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Bytes -> Builder
Builder.compactBytes Bytes
metadata
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields