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 []