{-# 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 []