module Hscaffold.Interpreter.IO where
import Control.Monad.Catch
import Control.Monad.IO.Class
import Control.Monad.Writer
import qualified Data.Text.IO as Text
import System.Directory
import System.FilePath
import System.IO.Temp
import System.Posix.Files
import Hscaffold.Interpreter.Common
import Hscaffold.Types
runHscaffold :: MonadIO m => FilePath -> WriterT ScaffoldActionV m a -> m a
runHscaffold root w = do
(o, ws) <- runWriterT w
liftIO $ mapM_ (runAction root) ws
return o
runHscaffoldIO :: FilePath -> ScaffoldMonadIO a -> IO a
runHscaffoldIO = runHscaffold
runAction :: FilePath -> ScaffoldActionType e -> IO ()
runAction _ (ScaffoldActionTypeExtension _) =
return ()
runAction root (SetPermissions perms fp) =
setPermissions (mkActionPath root fp) perms
runAction root (Link fp1 fp2) =
createSymbolicLink (mkActionPath root fp1) (mkActionPath root fp2)
runAction root (File fp txt) = do
let fp' = mkActionPath root fp
createDirectoryIfMissing True (takeDirectory fp')
Text.writeFile fp' txt
runAction root (Directory fp nested) = do
createDirectoryIfMissing True (mkActionPath root fp)
mapM_ (runAction (mkActionPath root fp)) nested
runAction root (Copy fp1 fp2) = do
let fp1' = mkActionPath root fp1
fp2' = mkActionPath root fp2
copyFile fp1' fp2'
withTemporaryHscaffold :: (MonadMask m, MonadIO m)
=> ScaffoldMonadT m a
-> (FilePath -> m b)
-> m b
withTemporaryHscaffold =
withTemporaryHscaffold' "hscaffold"
withTemporaryHscaffold' :: (MonadMask m, MonadIO m)
=> String
-> ScaffoldMonadT m a
-> (FilePath -> m b)
-> m b
withTemporaryHscaffold' name scaffold action =
withSystemTempDirectory name $
\tmp -> do
_ <- runHscaffold tmp scaffold
action tmp
withTemporaryHscaffoldIO :: ScaffoldMonadIO a -> (FilePath -> IO b) -> IO b
withTemporaryHscaffoldIO =
withTemporaryHscaffold
withTemporaryHscaffoldIO' :: String
-> ScaffoldMonadIO a
-> (FilePath -> IO b)
-> IO b
withTemporaryHscaffoldIO' =
withTemporaryHscaffold'