{-# 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.LeaveGroup.Request.V5
  ( Request(..)
  , Member(..)
  , toChunks
  ) where

import Prelude hiding (id)

import Data.Int (Int16,Int32,Int64)
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 Leave Group request V5.
data Request = Request
  { Request -> Text
groupId :: !Text
  , Request -> SmallArray Member
members :: !(SmallArray Member)
  }

data Member = Member
  { Member -> Text
memberId :: !Text
  , Member -> Maybe Text
groupInstanceId :: !(Maybe Text)
  , Member -> Text
reason :: !Text
  }

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{Text
$sel:groupId:Request :: Request -> Text
groupId :: Text
groupId,SmallArray Member
$sel:members:Request :: Request -> SmallArray Member
members :: SmallArray Member
members} =
  Text -> Builder
Builder.compactString Text
groupId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  (Member -> Builder) -> SmallArray Member -> Builder
forall a. (a -> Builder) -> SmallArray a -> Builder
Builder.compactArray Member -> Builder
encodeMember SmallArray Member
members
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Word8 -> Builder
Builder.word8 Word8
0

encodeMember :: Member -> Builder
encodeMember :: Member -> Builder
encodeMember Member{Text
$sel:memberId:Member :: Member -> Text
memberId :: Text
memberId,Maybe Text
$sel:groupInstanceId:Member :: Member -> Maybe Text
groupInstanceId :: Maybe Text
groupInstanceId,Text
$sel:reason:Member :: Member -> Text
reason :: Text
reason} =
  Text -> Builder
Builder.compactString Text
memberId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Maybe Text -> Builder
Builder.compactNullableString Maybe Text
groupInstanceId
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Text -> Builder
Builder.compactString Text
reason
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Word8 -> Builder
Builder.word8 Word8
0