packages feed

hscaffold-0.4.1.0: src/Hscaffold/Generator/Directory.hs

module Hscaffold.Generator.Directory where

import           Data.List
import qualified Data.Text.IO     as Text
import           System.Directory
import           System.FilePath

import           Hscaffold.Types

-- | Converts a directory to scaffold actions
hscaffoldFromDirectory :: FilePath -> IO (ScaffoldAction e)
hscaffoldFromDirectory =
    hscaffoldFromDirectoryWith (filter (not . ("." `isPrefixOf`)))

-- | Converts a directory to scaffold actions with a custom filter function. By
-- default we ignore directories starting with @.@
hscaffoldFromDirectoryWith :: ([FilePath] -> [FilePath])
                           -> FilePath
                           -> IO (ScaffoldAction e)
hscaffoldFromDirectoryWith =
    hscaffoldFromDirectoryWith' False

hscaffoldFromDirectoryWith' :: Traversable t
                            => Bool
                            -> ([FilePath] -> t FilePath)
                            -> FilePath
                            -> IO [ScaffoldActionType e]
hscaffoldFromDirectoryWith' isRecur p root = do
    ls <- p <$> getDirectoryContents root
    concat <$> mapM classify ls
  where
    fromFile fp' fp = do
        txt <- Text.readFile fp'
        return [ File (normalise fp) txt ]
    fromDir = hscaffoldFromDirectoryWith' True p
    classify fp = do
        let fp' = root </> fp
        isfl <- doesFileExist fp'
        isdir <- doesDirectoryExist fp'
        if isfl
            then fromFile fp' (if isRecur then fp' else fp)
            else if isdir then fromDir fp' else return []