module TestcontainersPostgresql
  ( Configs.Config.Config (..),
    Configs.Distro.Distro (..),
    Configs.Auth.Auth (..),
    run,
  )
where

import Data.Function
import Data.Text (Text)
import qualified TestContainers
import qualified TestContainers.Hspec
import qualified TestcontainersPostgresql.Configs.Auth as Configs.Auth
import qualified TestcontainersPostgresql.Configs.Config as Configs.Config
import qualified TestcontainersPostgresql.Configs.Distro as Configs.Distro
import Prelude

setup :: (TestContainers.MonadDocker m) => Configs.Config.Config -> m (Text, Int)
setup :: forall (m :: * -> *). MonadDocker m => Config -> m (Text, Int)
setup Config
config = do
  Container
container <- ContainerRequest -> TestContainer Container
TestContainers.run (Config -> ContainerRequest
Configs.Config.toContainerRequest Config
config)
  pure $ Container -> Port -> (Text, Int)
TestContainers.containerAddress Container
container Port
5432

-- | Run a session on a PostgreSQL container in the scope of a host and a port.
run :: Configs.Config.Config -> ((Text, Int) -> IO ()) -> IO ()
run :: Config -> ((Text, Int) -> IO ()) -> IO ()
run Config
config = do
  TestContainer (Text, Int) -> ((Text, Int) -> IO ()) -> IO ()
forall a. TestContainer a -> (a -> IO ()) -> IO ()
TestContainers.Hspec.withContainers (Config -> TestContainer (Text, Int)
forall (m :: * -> *). MonadDocker m => Config -> m (Text, Int)
setup Config
config)