hasql-postgres-0.10.0: library/Hasql/Postgres/Statement/TemplateConverter.hs
module Hasql.Postgres.Statement.TemplateConverter where
import Hasql.Postgres.Prelude
import qualified Data.Text.Encoding as TE
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Builder as BB
import qualified Data.ByteString.Lazy.Builder.ASCII as BB
import qualified Hasql.Postgres.Statement.TemplateConverter.Parser as Parser
-- |
--
-- >>> BB.toLazyByteString $ convert "asdf ? \"'\\\"?'\" d 2??"
-- "asdf $1 \"'\\\"?'\" d 2$2$3"
convert :: Text -> BB.Builder
convert template =
either ($bug . showString "Unparsable template: " . shows template .
showString "; Error: " . show) id $
do
parts <- Parser.run (TE.encodeUtf8 template) Parser.parts
return $
mconcat $ ($ 1) $ evalState $ do
forM parts $ \case
Parser.Chunk c -> do
return c
Parser.Placeholder -> do
i <- get
put $ succ i
return $ BB.char8 '$' <> BB.wordDec i