madlang-0.1.0.2: src/Text/Madlibs/Exec/Main.hs
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
-- | Provides `madlang` runMadlangutable
module Text.Madlibs.Exec.Main where
import Text.Madlibs.Cata.Run
import Text.Madlibs.Ana.Parse
import Text.Madlibs.Internal.Types
import Text.Madlibs.Internal.Utils
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import Text.Megaparsec
import Options.Generic
-- | datatype for the program
data Program = Program { input :: FilePath <?> "filepath to template"
, debug :: Bool <?> "whether to display parsed RandTok" --also: display crontab in that case?
, rep :: Maybe Int <?> "How many times to repeat"
} deriving (Generic)
-- | Generated automatically by optparse-generic.
instance ParseRecord Program where
-- | Main program action
runMadlang :: IO ()
runMadlang = do
x <- getRecord "Text.Madlibs templating DSL"
case unHelpful . rep $ x of
(Just n) -> sequence_ . (take n) . repeat $ template x
Nothing -> template x
-- | given a parsed record perform the appropriate IO action
template :: Program -> IO ()
template rec = do
let filepath = unHelpful . input $ rec
parsed <- parseFile filepath
runFile filepath >>= TIO.putStrLn
if unHelpful . debug $ rec then
print parsed
else
pure ()
-- | Generate randomized text from a template
templateGen :: T.Text -> Either (ParseError Char Dec) (IO T.Text)
templateGen txt = run <$> parseTok txt
-- | Generate randomized text from a file conatining a template
runFile :: FilePath -> IO T.Text
runFile filepath = do
txt <- readFile' filepath
either (pure . parseErrorPretty') (>>= (pure . show')) (templateGen txt)
-- | Parse a template file into the `RandTok` data type
parseFile :: FilePath -> IO (Either (ParseError Char Dec) RandTok)
parseFile filepath = do
txt <- readFile' filepath
let val = parseTok txt
pure val