shake-0.2.8: Development/Shake/Report.hs
{-# LANGUAGE PatternGuards #-}
module Development.Shake.Report(buildReport) where
import Control.Monad
import System.FilePath
import Paths_shake
-- | Generates an HTML report given some build system
-- profiling data in JSON format.
buildReport :: String -> FilePath -> IO ()
buildReport json out = do
htmlDir <- getDataFileName "html"
report <- readFile $ htmlDir </> "report.html"
let f name | name == "data" = return json
| otherwise = readFile $ htmlDir </> name
writeFile out =<< runTemplate f report
-- | Template Engine
runTemplate :: Monad m => (String -> m String) -> String -> m String
runTemplate ask ('$':'$':xs) = liftM ('$':) $ runTemplate ask xs
runTemplate ask ('$':xs) | (name,_:rest) <- break (== '$') xs = liftM2 (++) (ask name) (runTemplate ask rest)
runTemplate ask (x:xs) = liftM (x:) $ runTemplate ask xs
runTemplate ask [] = return []