module Hasql.Connection.Setting.Connection.Param
  ( Param,
    host,
    port,
    user,
    password,
    dbname,
    other,
  )
where

import Data.ByteString.Builder qualified as BB
import Data.ByteString.Lazy qualified as BL
import Data.Text.Encoding qualified as Text
import Hasql.Connection.Config.ConnectionString.Params qualified as Config
import Hasql.Prelude

-- | Parameter of the connection instructions.
newtype Param = Param (Config.Params -> Config.Params)

instance Config.Updates Param where
  update :: Param -> Params -> Params
update = Param -> Params -> Params
forall a b. Coercible a b => a -> b
coerce

-- | Host domain name or IP-address.
host :: Text -> Param
host :: Text -> Param
host =
  (Params -> Params) -> Param
Param ((Params -> Params) -> Param)
-> (Text -> Params -> Params) -> Text -> Param
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString -> Params -> Params
Config.setKeyValue ByteString
"host" (ByteString -> Params -> Params)
-> (Text -> ByteString) -> Text -> Params -> Params
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> ByteString
Text.encodeUtf8

-- | Port number.
port :: Word16 -> Param
port :: Word16 -> Param
port =
  (Params -> Params) -> Param
Param ((Params -> Params) -> Param)
-> (Word16 -> Params -> Params) -> Word16 -> Param
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString -> Params -> Params
Config.setKeyValue ByteString
"port" (ByteString -> Params -> Params)
-> (Word16 -> ByteString) -> Word16 -> Params -> Params
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. LazyByteString -> ByteString
BL.toStrict (LazyByteString -> ByteString)
-> (Word16 -> LazyByteString) -> Word16 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Builder -> LazyByteString
BB.toLazyByteString (Builder -> LazyByteString)
-> (Word16 -> Builder) -> Word16 -> LazyByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Word16 -> Builder
BB.word16Dec

-- | User name.
user :: Text -> Param
user :: Text -> Param
user =
  (Params -> Params) -> Param
Param ((Params -> Params) -> Param)
-> (Text -> Params -> Params) -> Text -> Param
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString -> Params -> Params
Config.setKeyValue ByteString
"user" (ByteString -> Params -> Params)
-> (Text -> ByteString) -> Text -> Params -> Params
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> ByteString
Text.encodeUtf8

-- | Password.
password :: Text -> Param
password :: Text -> Param
password =
  (Params -> Params) -> Param
Param ((Params -> Params) -> Param)
-> (Text -> Params -> Params) -> Text -> Param
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString -> Params -> Params
Config.setKeyValue ByteString
"password" (ByteString -> Params -> Params)
-> (Text -> ByteString) -> Text -> Params -> Params
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> ByteString
Text.encodeUtf8

-- | Database name.
dbname :: Text -> Param
dbname :: Text -> Param
dbname =
  (Params -> Params) -> Param
Param ((Params -> Params) -> Param)
-> (Text -> Params -> Params) -> Text -> Param
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString -> Params -> Params
Config.setKeyValue ByteString
"dbname" (ByteString -> Params -> Params)
-> (Text -> ByteString) -> Text -> Params -> Params
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> ByteString
Text.encodeUtf8

-- | Any other parameter under the provided name according to <https://www.postgresql.org/docs/17/libpq-connect.html#LIBPQ-CONNSTRING the PostgreSQL format>.
other :: Text -> Text -> Param
other :: Text -> Text -> Param
other Text
name =
  (Params -> Params) -> Param
Param ((Params -> Params) -> Param)
-> (Text -> Params -> Params) -> Text -> Param
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString -> Params -> Params
Config.setKeyValue (Text -> ByteString
Text.encodeUtf8 Text
name) (ByteString -> Params -> Params)
-> (Text -> ByteString) -> Text -> Params -> Params
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> ByteString
Text.encodeUtf8