module Hasql.TH
(
singletonStatement,
maybeStatement,
vectorStatement,
foldStatement,
resultlessStatement,
rowsAffectedStatement,
uncheckedSql,
uncheckedSqlFile,
)
where
import Hasql.TH.Prelude hiding (exp)
import Hasql.Statement (Statement)
import Data.Vector (Vector)
import Language.Haskell.TH.Syntax
import Language.Haskell.TH.Quote
import qualified Hasql.TH.Construction.Exp as Exp
import qualified Hasql.TH.Extraction.Exp as ExpExtraction
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import qualified PostgresqlSyntax.Ast as Ast
import qualified PostgresqlSyntax.Parsing as Parsing
exp :: (String -> Q Exp) -> QuasiQuoter
exp :: (String -> Q Exp) -> QuasiQuoter
exp = let
_unsupported :: p -> m a
_unsupported p
_ = String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Unsupported"
in \ String -> Q Exp
_exp -> (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter String -> Q Exp
_exp String -> Q Pat
forall (m :: * -> *) p a. MonadFail m => p -> m a
_unsupported String -> Q Type
forall (m :: * -> *) p a. MonadFail m => p -> m a
_unsupported String -> Q [Dec]
forall (m :: * -> *) p a. MonadFail m => p -> m a
_unsupported
expParser :: (Text -> Either Text Exp) -> QuasiQuoter
expParser :: (Text -> Either Text Exp) -> QuasiQuoter
expParser Text -> Either Text Exp
_parser =
(String -> Q Exp) -> QuasiQuoter
exp ((String -> Q Exp) -> QuasiQuoter)
-> (String -> Q Exp) -> QuasiQuoter
forall a b. (a -> b) -> a -> b
$ \ String
_inputString -> (Text -> Q Exp) -> (Exp -> Q Exp) -> Either Text Exp -> Q Exp
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Q Exp
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Q Exp) -> (Text -> String) -> Text -> Q Exp
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> String
Text.unpack) Exp -> Q Exp
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text Exp -> Q Exp) -> Either Text Exp -> Q Exp
forall a b. (a -> b) -> a -> b
$ Text -> Either Text Exp
_parser (Text -> Either Text Exp) -> Text -> Either Text Exp
forall a b. (a -> b) -> a -> b
$ String -> Text
forall a. IsString a => String -> a
fromString String
_inputString
expPreparableStmtAstParser :: (Ast.PreparableStmt -> Either Text Exp) -> QuasiQuoter
expPreparableStmtAstParser :: (PreparableStmt -> Either Text Exp) -> QuasiQuoter
expPreparableStmtAstParser PreparableStmt -> Either Text Exp
_parser =
(Text -> Either Text Exp) -> QuasiQuoter
expParser ((Text -> Either Text Exp) -> QuasiQuoter)
-> (Text -> Either Text Exp) -> QuasiQuoter
forall a b. (a -> b) -> a -> b
$ \ Text
_input -> do
PreparableStmt
_ast <- (String -> Text)
-> Either String PreparableStmt -> Either Text PreparableStmt
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first String -> Text
forall a. IsString a => String -> a
fromString (Either String PreparableStmt -> Either Text PreparableStmt)
-> Either String PreparableStmt -> Either Text PreparableStmt
forall a b. (a -> b) -> a -> b
$ Parser PreparableStmt -> Text -> Either String PreparableStmt
forall a. Parser a -> Text -> Either String a
Parsing.run (Parser PreparableStmt -> Parser PreparableStmt
forall a. Parser a -> Parser a
Parsing.atEnd Parser PreparableStmt
Parsing.preparableStmt) Text
_input
PreparableStmt -> Either Text Exp
_parser PreparableStmt
_ast
singletonStatement :: QuasiQuoter
singletonStatement :: QuasiQuoter
singletonStatement = (PreparableStmt -> Either Text Exp) -> QuasiQuoter
expPreparableStmtAstParser ((Exp -> Exp) -> PreparableStmt -> Either Text Exp
ExpExtraction.undecodedStatement Exp -> Exp
Exp.singleRowResultDecoder)
maybeStatement :: QuasiQuoter
maybeStatement :: QuasiQuoter
maybeStatement = (PreparableStmt -> Either Text Exp) -> QuasiQuoter
expPreparableStmtAstParser ((Exp -> Exp) -> PreparableStmt -> Either Text Exp
ExpExtraction.undecodedStatement Exp -> Exp
Exp.rowMaybeResultDecoder)
vectorStatement :: QuasiQuoter
vectorStatement :: QuasiQuoter
vectorStatement = (PreparableStmt -> Either Text Exp) -> QuasiQuoter
expPreparableStmtAstParser ((Exp -> Exp) -> PreparableStmt -> Either Text Exp
ExpExtraction.undecodedStatement Exp -> Exp
Exp.rowVectorResultDecoder)
foldStatement :: QuasiQuoter
foldStatement :: QuasiQuoter
foldStatement = (PreparableStmt -> Either Text Exp) -> QuasiQuoter
expPreparableStmtAstParser PreparableStmt -> Either Text Exp
ExpExtraction.foldStatement
resultlessStatement :: QuasiQuoter
resultlessStatement :: QuasiQuoter
resultlessStatement = (PreparableStmt -> Either Text Exp) -> QuasiQuoter
expPreparableStmtAstParser ((Exp -> Exp) -> PreparableStmt -> Either Text Exp
ExpExtraction.undecodedStatement (Exp -> Exp -> Exp
forall a b. a -> b -> a
const Exp
Exp.noResultResultDecoder))
rowsAffectedStatement :: QuasiQuoter
rowsAffectedStatement :: QuasiQuoter
rowsAffectedStatement = (PreparableStmt -> Either Text Exp) -> QuasiQuoter
expPreparableStmtAstParser ((Exp -> Exp) -> PreparableStmt -> Either Text Exp
ExpExtraction.undecodedStatement (Exp -> Exp -> Exp
forall a b. a -> b -> a
const Exp
Exp.rowsAffectedResultDecoder))
uncheckedSql :: QuasiQuoter
uncheckedSql :: QuasiQuoter
uncheckedSql = (String -> Q Exp) -> QuasiQuoter
exp ((String -> Q Exp) -> QuasiQuoter)
-> (String -> Q Exp) -> QuasiQuoter
forall a b. (a -> b) -> a -> b
$ Exp -> Q Exp
forall (m :: * -> *) a. Monad m => a -> m a
return (Exp -> Q Exp) -> (String -> Exp) -> String -> Q Exp
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> Exp
Exp.byteString (ByteString -> Exp) -> (String -> ByteString) -> String -> Exp
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 (Text -> ByteString) -> (String -> Text) -> String -> ByteString
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> Text
forall a. IsString a => String -> a
fromString
uncheckedSqlFile :: QuasiQuoter
uncheckedSqlFile :: QuasiQuoter
uncheckedSqlFile = QuasiQuoter -> QuasiQuoter
quoteFile QuasiQuoter
uncheckedSql