module Text.Madlibs.Ana.Resolve where
import qualified Data.Text as T
import Text.Megaparsec
import Text.Madlibs.Internal.Types
import Text.Madlibs.Internal.Utils
import Text.Madlibs.Ana.Parse
import Text.Madlibs.Ana.ParseUtils
import Text.Madlibs.Cata.Run
import Data.Composition
import System.Directory
import Lens.Micro
import Data.Monoid
import Control.Applicative
import Control.Monad
parseFile :: [T.Text]
-> FilePath
-> FilePath
-> IO (Either (ParseError Char Dec) RandTok)
parseFile = fmap (fmap takeTemplate) .** (getInclusionCtx False)
getInclusionCtx :: Bool -> [T.Text] -> FilePath -> FilePath -> IO (Either (ParseError Char Dec) [(Key, RandTok)])
getInclusionCtx isTree ins folder filepath = do
file <- readFile' (folder ++ filepath)
let filenames = either (error . show) id $ parseInclusions filepath file
let resolveKeys file = map (over _1 ((((T.pack . (<> "-")) . dropExtension) $ file) <>))
ctxPure <- mapM (getInclusionCtx isTree ins folder) filenames
let ctx = (zipWith resolveKeys filenames) <$> sequence ctxPure
parseCtx isTree ins (concat . (either (const []) id) $ ctx) (folder ++ filepath)
runFile :: [T.Text] -> FilePath -> IO T.Text
runFile ins toFolder = do
exists <- doesDirectoryExist (getDir toFolder)
let filepath = reverse . (takeWhile (/='/')) . reverse $ toFolder
runInFolder ins (getDir toFolder) filepath
runInFolder :: [T.Text] -> FilePath -> FilePath -> IO T.Text
runInFolder = ((either (pure . parseErrorPretty') (>>= (pure . show'))) =<<) .** (fmap (fmap run) .** parseFile)
runText :: [T.Text] -> String -> T.Text -> IO T.Text
runText vars name = (either (pure . parseErrorPretty') id) . (fmap run) . (parseTok name [] vars)
parseCtx :: Bool -> [T.Text] -> [(Key, RandTok)] -> FilePath -> IO (Either (ParseError Char Dec) [(Key, RandTok)])
parseCtx isTree ins state filepath = do
txt <- readFile' filepath
let keys = (if isTree then parseTreeF else parseTokF) filepath state ins txt
pure keys
makeTree :: [T.Text] -> FilePath -> FilePath -> IO (Either (ParseError Char Dec) RandTok)
makeTree = fmap (fmap takeTemplate) .** (getInclusionCtx True)