packages feed

snap-core-0.1.1: src/Snap/Starter.hs

module Main where

------------------------------------------------------------------------------
import System
import System.Directory
import System.FilePath.Posix
------------------------------------------------------------------------------


------------------------------------------------------------------------------
usage :: String
usage = unlines
    ["Usage:"
    ,""
    ,"  snap <action>"
    ,""
    ,"    <action> can be one of:"
    ,"      init - create a new project directory structure in the current directory"
    ]


------------------------------------------------------------------------------
initProject :: IO ()
initProject = do
    cur <- getCurrentDirectory
    let dirs = splitDirectories cur
        projName = last dirs
    writeFile (projName++".cabal") (cabalFile projName)
    createDirectory "src"
    writeFile "src/Main.hs" mainFile


------------------------------------------------------------------------------
main :: IO ()
main = do
    args <- getArgs
    case args of
        ["init"] -> initProject
        _        -> do putStrLn usage
                       exitFailure


------------------------------------------------------------------------------
cabalFile :: String -> String
cabalFile projName = unlines
    ["Name:                "++projName
    ,"Version:             0.1"
    ,"Synopsis:            Project Synopsis Here"
    ,"Description:         Project Description Here"
    ,"License:             AllRightsReserved"
    ,"Author:              Author"
    ,"Maintainer:          maintainer@example.com"
    ,"Stability:           Experimental"
    ,"Category:            Web"
    ,"Build-type:          Simple"
    ,"Cabal-version:       >=1.2"
    ,""
    ,"Executable "++projName
    ,"  hs-source-dirs: src"
    ,"  main-is: Main.hs"
    ,""
    ,"  Build-depends:"
    ,"    base >= 4,"
    ,"    haskell98,"
    ,"    monads-fd >= 0.1 && <0.2,"
    ,"    bytestring >= 0.9.1 && <0.10,"
    ,"    snap-core >= 0.1 && <0.2,"
    ,"    snap-server >= 0.1 && <0.2,"
    ,"    heist >= 0.1 && <0.2,"
    ,"    filepath >= 1.1 && <1.2"
    ,""
    ,"  ghc-options: -O2 -Wall -fwarn-tabs -funbox-strict-fields -threaded -fno-warn-unused-imports"
    ,""
    ,"  Extensions: OverloadedStrings"
    ]


------------------------------------------------------------------------------
mainFile :: String
mainFile = unlines
    ["module Main where"
    ,""
    ,"import           System"
    ,"import           Control.Applicative"
    ,"import           Control.Monad.Trans"
    ,"import           Snap.Http.Server"
    ,"import           Snap.Types"
    ,"import           Snap.Util.FileServe"
    ,"import           Text.Templating.Heist"
    ,""
    ,"site :: Snap ()"
    ,"site ="
    ,"    ifTop (writeBS \"hello world\") <|>"
    ,"    fileServe \".\""
    ,""
    ,"main :: IO ()"
    ,"main = do"
    ,"    args <- getArgs"
    ,"    let port = case args of"
    ,"                   []  -> 8000"
    ,"                   p:_ -> read p"
    ,"    httpServe \"*\" port \"myserver\""
    ,"        (Just \"access.log\")"
    ,"        (Just \"error.log\")"
    ,"        site"
    ]