module Text.Madlibs.Generate.TH
( madFile
, madlang
) where
import Data.FileEmbed
import qualified Data.Text as T
import Data.Text.Encoding
import Data.Void
import Language.Haskell.TH hiding (Dec)
import Language.Haskell.TH.Quote
import Text.Madlibs.Ana.Parse
import Text.Madlibs.Internal.Utils
import Text.Megaparsec
madlang :: QuasiQuoter
madlang = QuasiQuoter { quoteExp = textToExpression
, quotePat = error "quasi-quoter does not support patterns"
, quoteType = error "quasi-quoter does not support types"
, quoteDec = error "quasi-quoter does not support top-level quotes"
}
textToExpression :: String -> Q Exp
textToExpression txt = do
parse' <- [|parseTok "source" [] []|]
pure $ (VarE 'errorgen) `AppE` (parse' `AppE` ((VarE 'T.pack) `AppE` (LitE (StringL (txt)))))
errorgen :: Either (ParseError Char (ErrorFancy Void)) a -> a
errorgen = either (error . T.unpack . show') id
madFile :: FilePath -> Q Exp
madFile path = do
file <- (embedFile path)
parse' <- [|(parseTok "source" [] []) . decodeUtf8|]
pure $ (VarE 'errorgen) `AppE` (parse' `AppE` file)