FerryCore-0.4.5: src/Database/Ferry/Compiler/ExecuteStep.hs
{-# LANGUAGE FlexibleContexts #-}
{-| The compilation process is build out of small steps, this module provides the infrastructure
that executes one such step. -}
module Database.Ferry.Compiler.ExecuteStep (executeStep) where
import Database.Ferry.Compiler.Types
-- | Apply a compilation step to an expression of type a. The result of type b is returned in a phaseresult monad
executeStep :: CompilationStep a b -> a -> PhaseResult b
executeStep step i = do
opts <- getConfig
phaseHeader (stageName step) (stageMode step)
b <- stageStep step i -- stageStep step gets the function that is to be applied this phase
mapM_ (createArtefacts b) $ stageArtefacts step
if (mode opts == stageMode step)
then endProcess
else return b
-- | The artefacts that can be generated by a compilationstep are generated by this function
createArtefacts :: b -> (Artefact, String, b -> ArtefactResult) -> PhaseResult ()
createArtefacts i (a, e, f) = do
opts <- getConfig
logMsg line
logMsg $ "Artefact creation stage for: " ++ (show a)
if elem a $ artefact opts
then do
let file = case output opts of
Nothing -> Nothing
(Just file') -> Just $ file' ++ "." ++ e
logMsg "Creating artefact"
s <- artefactToPhaseResult $ f i
addFile file s
logMsg "Artefact creation done"
logMsg line
return ()
else do
logMsg "Artefact not required. Skipping artefact creation."
logMsg line
return ()
-- | Helper function to generate the phaseheader in the log
phaseHeader :: Name -> Mode -> PhaseResult ()
phaseHeader n s = do
c <- getConfig
logMsg line
logMsg $ "Compiler stage: " ++ (show s)
logMsg $ "Stage name: " ++ n
logMsg "Compiling with the following options:"
logMsg $ show c
logMsg line
return ()