module Hasql.QParser where
import Hasql.Prelude hiding (takeWhile)
import Data.Attoparsec.Text hiding (Result)
import qualified Data.Text as Text
type Result =
(Word)
parse :: Text -> Either String Result
parse =
parseOnly $ flip execStateT 0 $
statement *>
(lift endOfInput <|>
(void (lift (char ';')) <* fail "A semicolon detected. Only single statements are allowed"))
where
statement =
skipMany1 $
void (lift stringLit) <|>
void (lift (char '?') <* modify succ) <|>
void (lift (notChar ';'))
stringLit :: Parser Text
stringLit =
do
quote <-
char '"' <|> char '\''
text <-
fmap mconcat $ many $
string "\\\\" <|>
string (fromString ['\\', quote]) <|>
(Text.singleton <$> notChar quote)
char quote
return text