module Hi.Template ( isTemplate , readTemplates , untemplate ) where import Hi.Directory (inTemporaryDirectory) import qualified Hi.Git as Git import Hi.Types import Control.Applicative ((<$>)) import qualified Data.ByteString as BS (readFile) import Data.List (isSuffixOf) import Data.List.Split (splitOn) import System.Directory (canonicalizePath, doesDirectoryExist) -- | Read templates in given 'TemplateSource' readTemplates :: TemplateSource -> IO Files readTemplates (FromRepo repo) = do e <- doesDirectoryExist repo repo' <- if e -- It seems to be an file path then canonicalizePath repo -- Not looks like a file path else return repo inTemporaryDirectory "hi" $ do Git.clone $ Git.expandUrl repo' paths <- Git.lsFiles mapM fetchFile paths fetchFile :: FilePath -> IO File fetchFile fp | isTemplate fp = TemplateFile fp <$> BS.readFile fp | otherwise = RegularFile fp <$> BS.readFile fp -- | Determine if a given filepath is a template file based on its extension -- >>> isTemplate "Example.hs.template" -- True -- >>> isTemplate "NotATemplate.hs" -- False isTemplate :: FilePath -> Bool isTemplate = isSuffixOf ".template" -- | Remove \".template\" from 'FilePath' untemplate :: FilePath -> FilePath untemplate = head . splitOn ".template"