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)