packages feed

hasql-1.6.4.4: testing-utils/Hasql/TestingUtils/TestingDsl.hs

module Hasql.TestingUtils.TestingDsl
  ( Session.Session,
    SessionError (..),
    Session.QueryError (..),
    Session.CommandError (..),
    runSessionOnLocalDb,
    runStatementInSession,
  )
where

import Hasql.Connection qualified as Connection
import Hasql.Session qualified as Session
import Hasql.Statement qualified as Statement
import Hasql.TestingUtils.Constants qualified as Constants
import Prelude

data SessionError
  = ConnectionError (Connection.ConnectionError)
  | SessionError (Session.QueryError)
  deriving (Show, Eq)

runSessionOnLocalDb :: Session.Session a -> IO (Either SessionError a)
runSessionOnLocalDb session =
  runExceptT $ acquire >>= \connection -> use connection <* release connection
  where
    acquire =
      ExceptT $ fmap (mapLeft ConnectionError) $ Connection.acquire Constants.localConnectionSettings
    use connection =
      ExceptT
        $ fmap (mapLeft SessionError)
        $ Session.run session connection
    release connection =
      lift $ Connection.release connection

runStatementInSession :: Statement.Statement a b -> a -> Session.Session b
runStatementInSession statement params =
  Session.statement params statement