{-# 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.Metadata.Request.V12
  ( Request(..)
  , Topic(..)
  , toChunks
    -- * Request Construction
  , all
  , none
  ) where

import Prelude hiding (id,all)

import Data.Int (Int16)
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

-- | A request for all topics. Authorized operations are
-- not requested.
all :: Request
all :: Request
all = Request
  { $sel:topics:Request :: Maybe (SmallArray Topic)
topics = Maybe (SmallArray Topic)
forall a. Maybe a
Nothing
  , $sel:allowAutoTopicCreation:Request :: Bool
allowAutoTopicCreation = Bool
False
  , $sel:includeTopicAuthorizedOperations:Request :: Bool
includeTopicAuthorizedOperations = Bool
False
  }

-- | A request for no topics. Authorized operations are
-- not requested. This is useful in situations where a user
-- wants to discover what brokers are in the cluster but does
-- not care about the topics.
none :: Request
none :: Request
none = Request
  { $sel:topics:Request :: Maybe (SmallArray Topic)
topics = SmallArray Topic -> Maybe (SmallArray Topic)
forall a. a -> Maybe a
Just SmallArray Topic
forall a. Monoid a => a
mempty
  , $sel:allowAutoTopicCreation:Request :: Bool
allowAutoTopicCreation = Bool
False
  , $sel:includeTopicAuthorizedOperations:Request :: Bool
includeTopicAuthorizedOperations = Bool
False
  }

-- | Kafka API Versions request V3.
data Request = Request
  { Request -> Maybe (SmallArray Topic)
topics :: !(Maybe (SmallArray Topic))
    -- ^ Null means "all topics", and the empty array means "no topics".
  , Request -> Bool
allowAutoTopicCreation :: !Bool
  , Request -> Bool
includeTopicAuthorizedOperations :: !Bool
  }

data Topic = Topic
  { Topic -> Word128
id :: {-# UNPACK #-} !Word128
  , Topic -> Maybe Text
name :: !(Maybe 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{Maybe (SmallArray Topic)
$sel:topics:Request :: Request -> Maybe (SmallArray Topic)
topics :: Maybe (SmallArray Topic)
topics,Bool
$sel:allowAutoTopicCreation:Request :: Request -> Bool
allowAutoTopicCreation :: Bool
allowAutoTopicCreation,Bool
$sel:includeTopicAuthorizedOperations:Request :: Request -> Bool
includeTopicAuthorizedOperations :: Bool
includeTopicAuthorizedOperations} =
  (Topic -> Builder) -> Maybe (SmallArray Topic) -> Builder
forall a. (a -> Builder) -> Maybe (SmallArray a) -> Builder
Builder.compactNullableArray Topic -> Builder
encodeTopic Maybe (SmallArray Topic)
topics
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Bool -> Builder
Builder.boolean Bool
allowAutoTopicCreation
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Bool -> Builder
Builder.boolean Bool
includeTopicAuthorizedOperations
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields

encodeTopic :: Topic -> Builder
encodeTopic :: Topic -> Builder
encodeTopic Topic{Word128
$sel:id:Topic :: Topic -> Word128
id :: Word128
id,Maybe Text
$sel:name:Topic :: Topic -> Maybe Text
name :: Maybe Text
name} =
  Word128 -> Builder
Builder.word128 Word128
id
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Maybe Text -> Builder
Builder.compactNullableString Maybe Text
name
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
  Word8 -> Builder
Builder.word8 Word8
0 -- zero tagged fields