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

module Kafka.Assignment.Request.V1
  ( Assignment(..)
  , Ownership(..)
  , toChunks
  ) where

import Prelude hiding (id)

import Data.Int (Int16,Int32,Int64)
import Data.Text (Text)
import Data.Bytes (Bytes)
import Data.Bytes.Builder (Builder)
import Data.Bytes.Chunks (Chunks)
import Data.Primitive (SmallArray)
import Kafka.Subscription.Request.V1 (Ownership(..),encodeOwnership)

import qualified Kafka.Builder as Builder

-- | Kafka consumer protocol assignment v1.
data Assignment = Assignment
  { Assignment -> SmallArray Ownership
assignedPartitions :: !(SmallArray Ownership)
  , Assignment -> Bytes
userData :: !Bytes
  } deriving stock (Int -> Assignment -> ShowS
[Assignment] -> ShowS
Assignment -> String
(Int -> Assignment -> ShowS)
-> (Assignment -> String)
-> ([Assignment] -> ShowS)
-> Show Assignment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Assignment -> ShowS
showsPrec :: Int -> Assignment -> ShowS
$cshow :: Assignment -> String
show :: Assignment -> String
$cshowList :: [Assignment] -> ShowS
showList :: [Assignment] -> ShowS
Show)

-- | Serializes the version number at the beginning.
toChunks :: Assignment -> Chunks
toChunks :: Assignment -> Chunks
toChunks = Int -> Builder -> Chunks
Builder.run Int
128 (Builder -> Chunks)
-> (Assignment -> Builder) -> Assignment -> Chunks
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Assignment -> Builder
encode

encode :: Assignment -> Builder
encode :: Assignment -> Builder
encode Assignment{SmallArray Ownership
$sel:assignedPartitions:Assignment :: Assignment -> SmallArray Ownership
assignedPartitions :: SmallArray Ownership
assignedPartitions,Bytes
$sel:userData:Assignment :: Assignment -> Bytes
userData :: Bytes
userData} =
  Int16 -> Builder
Builder.int16 Int16
1
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  (Ownership -> Builder) -> SmallArray Ownership -> Builder
forall a. (a -> Builder) -> SmallArray a -> Builder
Builder.array Ownership -> Builder
encodeOwnership SmallArray Ownership
assignedPartitions
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Bytes -> Builder
Builder.nonCompactBytes Bytes
userData