packages feed

marvin-0.0.1: initializer/Main.hs

{-# LANGUAGE DeriveGeneric #-}
module Main where

import ClassyPrelude
import Options.Generic
import Paths_marvin
import System.Directory
import System.FilePath
import Text.Mustache.Compile
import Text.Mustache.Render
import Text.Mustache.Types


data Opts = Opts 
    { botname :: String
    , adapter :: Maybe String
    } deriving (Generic)


instance ParseRecord Opts


fromEither :: Show a => Either a b -> b
fromEither (Left e) = error $ "Was left: " ++ show e
fromEither (Right v) = v


wantDirectories :: [FilePath]
wantDirectories = 
    [ "bot" ]


wantFiles :: [(FilePath, Template)]
wantFiles = map (second $ fromEither . compileTemplate "")
    [ ("Main.hs.mustache", "bot/Main.hs") 
    , ("MyScript.hs.mustache", "bot/MyScript.hs")
    , ("config.cfg.mustache", "config.cfg")
    , ("bot.cabal.mustache", "{{name}}.cabal")
    ]


adType :: [(String, String)]
adType =
    [ ("slack-rtm", "SlackRTMAdapter") ]


main :: IO ()
main = do
    opts <- getRecord "Marvin init"
    d <- (</> "initializer") <$> getDataDir
    unless ((== Just True) $ (`member` adType) <$> adapter opts) $ putStrLn "Unrecognized adapter"

    let subsData = object [ "name" ~> botname opts
                          , "scriptsig" ~> maybe "IsAdapter a => ScriptInit a" ("ScriptInit " ++) (adapter opts >>= flip lookup adType)
                          , "adapter" ~> adapter opts
                          ]

    for_ wantDirectories $ \dir -> do
        exists <- doesDirectoryExist dir
        unless exists (createDirectory dir)

    for_ wantFiles $ \(source, target) -> do
        let targetName = unpack $ substituteValue target subsData
        if ".mustache" == takeExtension source
            then do
                tpl <- fromEither <$> automaticCompile [d] source
                writeFile targetName $ substituteValue tpl subsData 
            else copyFile source targetName

    return ()