polysemy-hasql-0.0.1.0: lib/Polysemy/Hasql/Session.hs
module Polysemy.Hasql.Session where
import qualified Data.Text as Text
import Exon (exon)
import Hasql.Connection (Connection)
import qualified Hasql.Session as Session
import Hasql.Session (CommandError (ClientError, ResultError), QueryError (QueryError), Session)
import Hasql.Statement (Statement)
import qualified Polysemy.Db.Data.DbConnectionError as DbConnectionError
import qualified Polysemy.Db.Data.DbError as DbError
import Polysemy.Db.Data.DbError (DbError)
convertQueryError :: QueryError -> DbError
convertQueryError (QueryError template (Text.intercalate "," -> args) cmdError) =
case cmdError of
ClientError err ->
DbError.Connection (DbConnectionError.Query (maybe "no error" decodeUtf8 err))
ResultError err ->
DbError.Query [exon|#{decodeUtf8 template} #{args} #{show err}|]
runSession ::
Members [Stop DbError, Embed IO] r =>
Connection ->
Session a ->
Sem r a
runSession connection session = do
result <- tryIOError (Session.run session connection)
stopEither (first convertQueryError =<< first DbError.Unexpected result)
runStatement ::
Members [Stop DbError, Embed IO] r =>
Connection ->
p ->
Statement p a ->
Sem r a
runStatement connection p stmt =
runSession connection (Session.statement p stmt)