77 lines
2.0 KiB
Haskell
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."
|