{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Strict #-}
module VtUtils.FS
( fsCopyDirectory
) where
import Prelude (IO, (.), ($), (<$>), error, fmap)
import Control.Monad (forM_, unless, when)
import Data.Monoid ((<>))
import Data.Text (Text, pack, unpack)
import System.Directory (copyFile, createDirectory, doesDirectoryExist, listDirectory)
import VtUtils.Path
fsCopyDirectory :: Text -> Text -> IO ()
fsCopyDirectory src dest = do
srcex <- doesDirectoryExist (unpack src)
unless (srcex) $ error . unpack $
"Source directory does not exist, src: [" <> src <> "]"
destex <- doesDirectoryExist (unpack dest)
when (destex) $ error . unpack $
"Dest directory already exists, dest: [" <> dest <> "]"
createDirectory (unpack dest)
children <- (fmap pack) <$> listDirectory (unpack src)
forM_ children $ \child -> do
let srcpath = pathConcat src child
let destpath = pathConcat dest child
isdir <- doesDirectoryExist (unpack srcpath)
if isdir then
fsCopyDirectory srcpath destpath
else
copyFile (unpack srcpath) (unpack destpath)