{-# 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"