axel-0.0.1: src/Axel/Eval.hs
{-# LANGUAGE FlexibleContexts #-}
module Axel.Eval where
import Axel.Error (Error(MacroError))
import Axel.GHC (buildWithGHC, runWithGHC)
import Axel.Utils.Directory (withCurrentDirectoryLifted, withTempDirectory)
import Control.Monad.Except (MonadError, throwError)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Trans.Control (MonadBaseControl)
import System.Directory (createDirectoryIfMissing)
import System.FilePath ((</>))
import System.IO (writeFile)
execInterpreter :: (MonadError Error m, MonadIO m) => FilePath -> m String
execInterpreter scaffoldFilePath = do
debugResult <- liftIO $ buildWithGHC scaffoldFilePath
case debugResult of
Right _ -> runWithGHC scaffoldFilePath
Left stderr -> throwError $ MacroError stderr
evalMacro ::
(MonadBaseControl IO m, MonadError Error m, MonadIO m)
=> String
-> String
-> String
-> m String
evalMacro astDefinition scaffold macroDefinitionAndEnvironment =
withTempDirectory $ \directoryName ->
withCurrentDirectoryLifted directoryName $ do
let astDirectoryPath = "Axel" </> "Parse"
let macroDefinitionAndEnvironmentFileName =
"MacroDefinitionAndEnvironment.hs"
let scaffoldFileName = "Scaffold.hs"
liftIO $ createDirectoryIfMissing True astDirectoryPath
liftIO $ writeFile (astDirectoryPath </> "AST.hs") astDefinition
liftIO $
writeFile
macroDefinitionAndEnvironmentFileName
macroDefinitionAndEnvironment
liftIO $ writeFile scaffoldFileName scaffold
execInterpreter scaffoldFileName