{-# 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.Subscription.Request.V1
  ( Subscription(..)
  , Ownership(..)
  , encodeOwnership
  , 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.WideWord (Word128)
import Data.Primitive (SmallArray,PrimArray)

import qualified Kafka.Builder as Builder

-- | Kafka Init Producer ID request V4.
data Subscription = Subscription
  { Subscription -> SmallArray Text
topics :: !(SmallArray Text)
  , Subscription -> Bytes
userData :: !Bytes
  , Subscription -> SmallArray Ownership
ownedPartitions :: !(SmallArray Ownership)
  } deriving stock (Int -> Subscription -> ShowS
[Subscription] -> ShowS
Subscription -> String
(Int -> Subscription -> ShowS)
-> (Subscription -> String)
-> ([Subscription] -> ShowS)
-> Show Subscription
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Subscription -> ShowS
showsPrec :: Int -> Subscription -> ShowS
$cshow :: Subscription -> String
show :: Subscription -> String
$cshowList :: [Subscription] -> ShowS
showList :: [Subscription] -> ShowS
Show)

data Ownership = Ownership
  { Ownership -> Text
topic :: !Text
  , Ownership -> PrimArray Int32
partitions :: !(PrimArray Int32)
  } deriving stock (Int -> Ownership -> ShowS
[Ownership] -> ShowS
Ownership -> String
(Int -> Ownership -> ShowS)
-> (Ownership -> String)
-> ([Ownership] -> ShowS)
-> Show Ownership
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Ownership -> ShowS
showsPrec :: Int -> Ownership -> ShowS
$cshow :: Ownership -> String
show :: Ownership -> String
$cshowList :: [Ownership] -> ShowS
showList :: [Ownership] -> ShowS
Show)

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

encode :: Subscription -> Builder
encode :: Subscription -> Builder
encode Subscription{SmallArray Text
$sel:topics:Subscription :: Subscription -> SmallArray Text
topics :: SmallArray Text
topics,Bytes
$sel:userData:Subscription :: Subscription -> Bytes
userData :: Bytes
userData,SmallArray Ownership
$sel:ownedPartitions:Subscription :: Subscription -> SmallArray Ownership
ownedPartitions :: SmallArray Ownership
ownedPartitions} =
  Int16 -> Builder
Builder.int16 Int16
1
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  (Text -> Builder) -> SmallArray Text -> Builder
forall a. (a -> Builder) -> SmallArray a -> Builder
Builder.array Text -> Builder
Builder.string SmallArray Text
topics
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Bytes -> Builder
Builder.nonCompactBytes Bytes
userData
  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
ownedPartitions

encodeOwnership :: Ownership -> Builder
encodeOwnership :: Ownership -> Builder
encodeOwnership Ownership{Text
$sel:topic:Ownership :: Ownership -> Text
topic :: Text
topic,PrimArray Int32
$sel:partitions:Ownership :: Ownership -> PrimArray Int32
partitions :: PrimArray Int32
partitions} =
  Text -> Builder
Builder.string Text
topic
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  PrimArray Int32 -> Builder
Builder.int32Array PrimArray Int32
partitions