module Hasql.Commands
  ( Commands,
    asBytes,
    setEncodersToUTF8,
    setMinClientMessagesToWarning,
  )
where

import Data.ByteString.Builder qualified as BB
import Data.ByteString.Lazy qualified as BL
import Hasql.Prelude

newtype Commands
  = Commands (DList BB.Builder)
  deriving (NonEmpty Commands -> Commands
Commands -> Commands -> Commands
(Commands -> Commands -> Commands)
-> (NonEmpty Commands -> Commands)
-> (forall b. Integral b => b -> Commands -> Commands)
-> Semigroup Commands
forall b. Integral b => b -> Commands -> Commands
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: Commands -> Commands -> Commands
<> :: Commands -> Commands -> Commands
$csconcat :: NonEmpty Commands -> Commands
sconcat :: NonEmpty Commands -> Commands
$cstimes :: forall b. Integral b => b -> Commands -> Commands
stimes :: forall b. Integral b => b -> Commands -> Commands
Semigroup, Semigroup Commands
Commands
Semigroup Commands =>
Commands
-> (Commands -> Commands -> Commands)
-> ([Commands] -> Commands)
-> Monoid Commands
[Commands] -> Commands
Commands -> Commands -> Commands
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: Commands
mempty :: Commands
$cmappend :: Commands -> Commands -> Commands
mappend :: Commands -> Commands -> Commands
$cmconcat :: [Commands] -> Commands
mconcat :: [Commands] -> Commands
Monoid)

asBytes :: Commands -> ByteString
asBytes :: Commands -> ByteString
asBytes (Commands DList Builder
list) =
  ByteString -> ByteString
BL.toStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> ByteString
BB.toLazyByteString (Builder -> ByteString) -> Builder -> ByteString
forall a b. (a -> b) -> a -> b
$ (Builder -> Builder) -> DList Builder -> Builder
forall m a. Monoid m => (a -> m) -> DList a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Char -> Builder
BB.char7 Char
';') (DList Builder -> Builder) -> DList Builder -> Builder
forall a b. (a -> b) -> a -> b
$ DList Builder
list

setEncodersToUTF8 :: Commands
setEncodersToUTF8 :: Commands
setEncodersToUTF8 =
  DList Builder -> Commands
Commands (Builder -> DList Builder
forall a. a -> DList a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Builder
"SET client_encoding = 'UTF8'")

setMinClientMessagesToWarning :: Commands
setMinClientMessagesToWarning :: Commands
setMinClientMessagesToWarning =
  DList Builder -> Commands
Commands (Builder -> DList Builder
forall a. a -> DList a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Builder
"SET client_min_messages TO WARNING")