packages feed

hscaffold-0.4.0.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 []