marvin-0.0.1: preprocessor/Main.hs
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveGeneric #-}
import ClassyPrelude
import System.Directory
import System.FilePath
import Text.Mustache
import Text.Mustache.Compile
import Options.Generic
data Opts = Opts
{ adapter :: Maybe String
} deriving (Generic)
instance ParseRecord Opts
adapters :: [(String, (String, String))]
adapters =
[("slack-rtm", ("Marvin.Adapter.Slack", "SlackRTMAdapter"))]
tpl :: Template
tpl = $(embedTemplate ["app"] "Main.mustache")
main :: IO ()
main = do
args <- getArgs
case args of
(srcname': srcLoc: out:r) -> do
let opts = getRecordPure r
srcname = unpack srcname'
dir = takeDirectory srcname
paths <- filter (not . ((||) <$> isPrefixOf "_" <*> isPrefixOf ".")) <$> getDirectoryContents dir
files <- filterM (doesFileExist . (dir </>)) paths
let hsFiles = map dropExtensions $ filter (/= takeFileName srcname) $ filter ((`elem` [".hs", ".lhs"]) . takeExtension) files
adapterType = opts >>= adapter >>= flip lookup adapters
processed = substitute tpl (object [ "scripts" ~> intercalate ", " (map (++ ".script") hsFiles)
, "imports" ~> hsFiles
, "adapter-import" ~> map fst adapterType
, "adapter-type" ~> maybe "AddYourAdapterTypeHere" snd adapterType
])
writeFile (unpack out) processed
_ -> error "unexpected arguments"