module Stack.New
( newProject
) where
import Control.Monad (filterM, forM_, unless)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Logger (MonadLogger, logInfo)
import Data.ByteString (ByteString)
import qualified Data.ByteString as S
import Data.FileEmbed (embedDir)
import Data.Map (Map)
import qualified Data.Map as Map
import qualified Data.Text as T
import System.Directory (createDirectoryIfMissing,
doesFileExist)
import System.FilePath (takeDirectory)
newProject :: (MonadIO m, MonadLogger m)
=> m ()
newProject = do
$logInfo "NOTE: Currently stack new functionality is very rudimentary"
$logInfo "There are plans to make this feature more useful in the future"
$logInfo "For more information, see: https://github.com/commercialhaskell/stack/issues/137"
$logInfo "For now, we'll just be generating a basic project structure in your current directory"
exist <- filterM (liftIO . doesFileExist) (Map.keys files)
unless (null exist) $
error $ unlines
$ "The following files already exist, refusing to overwrite:"
: map ("- " ++) exist
$logInfo ""
forM_ (Map.toList files) $ \(fp, bs) -> do
$logInfo $ T.pack $ "Writing: " ++ fp
liftIO $ do
createDirectoryIfMissing True $ takeDirectory fp
S.writeFile fp bs
files :: Map FilePath ByteString
files = Map.fromList $(embedDir "new-template")