packages feed

indigo-0.6.0: app/FileGen.hs

-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- | File Generation machinery that resembles @summoner@ library.
module FileGen
  ( run
  ) where

import FileGen.Tree (FsTree(..), drawFsTree, makeFS)
import System.Directory (setCurrentDirectory)

import FileGen.Files qualified as F
import Paths_indigo (version)

run :: Text -> Maybe Text -> IO ()
run projectName gitRev =
  createProjectDirectoryCustom (CustomSettings projectName gitRev)

-- | From the given 'CustomSettings' creates the project.
createProjectDirectoryCustom :: CustomSettings -> IO ()
createProjectDirectoryCustom settings@CustomSettings{..} = do
  let tree = createProjectTemplateCustom settings
  makeFS "." tree
  putTextLn "The project with the following structure has been created:"
  drawFsTree tree
  setCurrentDirectory (toString sProjectName)

-- | Creating tree structure of the project.
createProjectTemplateCustom :: CustomSettings -> FsTree
createProjectTemplateCustom settings@CustomSettings{..} =
  Dir (toString sProjectName) $ generateFiles settings

-- | Files Template
generateFiles :: CustomSettings -> [FsTree]
generateFiles CustomSettings{..} =
  [ Dir "app"
      [ File "Main.hs" F.main ]
  , Dir "src"
      [ File "Basic.hs" F.basic ]
  , Dir "test"
      [ Dir "Test"
          [ File "Basic.hs" F.basicTest ]
      , File "Main.hs" F.mainTest
      , File "Tree.hs" F.treeTest
      ]
  , File "ChangeLog.md" (F.changelog sProjectName)
  , File "README.md" (F.readme sProjectName)
  , File ".gitignore" F.gitignore
  , File "package.yaml" (F.packageYaml sProjectName)
  , File "stack.yaml" F.stackYaml
  , File "indigo-snapshot.yaml" F.indigoSnapshotYaml
  , File "indigo-dependence-snapshot.yaml" $
      F.indigoDependenceSnapshotYaml $
        maybe (F.DSVPublishedVersion version) F.DSVGitCommitSha sGitRev
  ]

data CustomSettings = CustomSettings
  { sProjectName :: Text
  , sGitRev :: Maybe Text
  }