yesod/CLI/yesod.hs
2010-03-07 16:51:58 -08:00

77 lines
2.0 KiB
Haskell

{-# LANGUAGE TemplateHaskell #-}
import Data.FileEmbed
import Text.StringTemplate
import Data.ByteString.Char8 (ByteString, unpack)
import System.Directory
import System.Environment
import System.IO
import Data.Char
skel :: [(FilePath, ByteString)]
skel = $(embedDir "CLI/skel")
yesodInit :: FilePath -> [(String, String)] -> IO ()
yesodInit topDir a = do
mapM_ (\x -> createDirectoryIfMissing True $ topDir ++ x)
["static", "templates"]
mapM_ go skel
where
go (fp, bs) = do
let temp = newSTMP $ unpack bs
writeFile (topDir ++ fp) $ toString $ setManyAttrib a temp
main :: IO ()
main = do
args <- getArgs
case args of
["init"] -> yesodInit'
_ -> usage
usage :: IO ()
usage = putStrLn "Currently, the only support operation is \"init\"."
prompt :: String -> (String -> Bool) -> IO String
prompt s t = do
putStr s
hFlush stdout
x <- getLine
if t x
then return x
else do
putStrLn "That was not valid input."
prompt s t
yesodInit' :: IO ()
yesodInit' = do
putStrLn "Let's get started created a Yesod web application."
dest <-
prompt
"In which directory would you like to put the application? "
(not . null)
dt <-
prompt
"Give a data type name (first letter capital): "
(\x -> not (null x) && isUpper (head x))
pr <- prompt
"Name of project (cabal file): "
(not . null)
au <- prompt
"Author (cabal file): "
(not . null)
em <- prompt
"Author email (cabal file): "
(not . null)
ho <- prompt
"Homepage (cabal file): "
(not . null)
yesodInit (dest ++ "/")
[ ("Datatype", dt)
, ("project", pr)
, ("author", au)
, ("email", em)
, ("homepage", ho)
]
renameFile (dest ++ "/webapp.cabal") (dest ++ "/" ++ pr ++ ".cabal")
renameFile (dest ++ "/App.hs") (dest ++ "/" ++ dt ++ ".hs")
putStrLn "Your project has been initialized."