{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module Uniform.FileStatus
( getFileStatus,
isDirectory,
isRegularFile,
getFileStatus',
isSymbolicLink,
getModificationTimeFromStatus,
getFileSize,
P.EpochTime,
P.FileStatus,
)
where
import qualified System.Directory as S
import qualified System.Posix as P
import Uniform.Error
import Uniform.Filenames (Path, toShortFilePath)
import Uniform.Strings (putIOwords, showT)
unL :: Path df ar -> FilePath
unL :: Path df ar -> FilePath
unL = Path df ar -> FilePath
forall df ar. Path df ar -> FilePath
toShortFilePath
getFileStatus :: Path df ar -> m FileStatus
getFileStatus Path df ar
fp = IO FileStatus -> m FileStatus
forall (m :: * -> *) a.
(MonadError m, MonadIO m, ErrorType m ~ Text) =>
IO a -> m a
callIO (IO FileStatus -> m FileStatus) -> IO FileStatus -> m FileStatus
forall a b. (a -> b) -> a -> b
$ FilePath -> IO FileStatus
P.getFileStatus (FilePath -> IO FileStatus)
-> (Path df ar -> FilePath) -> Path df ar -> IO FileStatus
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Path df ar -> FilePath
forall df ar. Path df ar -> FilePath
unL (Path df ar -> IO FileStatus) -> Path df ar -> IO FileStatus
forall a b. (a -> b) -> a -> b
$ Path df ar
fp
getFileStatus' :: FilePath -> ErrIO P.FileStatus
getFileStatus' :: FilePath -> ErrIO FileStatus
getFileStatus' FilePath
fp = IO FileStatus -> ErrIO FileStatus
forall (m :: * -> *) a.
(MonadError m, MonadIO m, ErrorType m ~ Text) =>
IO a -> m a
callIO (IO FileStatus -> ErrIO FileStatus)
-> IO FileStatus -> ErrIO FileStatus
forall a b. (a -> b) -> a -> b
$ FilePath -> IO FileStatus
P.getFileStatus FilePath
fp
isRegularFile :: P.FileStatus -> Bool
isRegularFile :: FileStatus -> Bool
isRegularFile = FileStatus -> Bool
P.isRegularFile
isDirectory :: P.FileStatus -> Bool
isDirectory :: FileStatus -> Bool
isDirectory = FileStatus -> Bool
P.isDirectory
isSymbolicLink :: P.FileStatus -> Bool
isSymbolicLink :: FileStatus -> Bool
isSymbolicLink = FileStatus -> Bool
P.isSymbolicLink
getModificationTimeFromStatus :: P.FileStatus -> P.EpochTime
getModificationTimeFromStatus :: FileStatus -> EpochTime
getModificationTimeFromStatus = FileStatus -> EpochTime
P.modificationTime
getFileSize :: FileStatus -> FileOffset
getFileSize = FileStatus -> FileOffset
P.fileSize
createSymbolicLink :: Show (Path df ra) => Path df ra -> Path df ra -> ErrIO ()
createSymbolicLink :: Path df ra -> Path df ra -> ErrIO ()
createSymbolicLink Path df ra
fn Path df ra
tn = do
[Text] -> ErrIO ()
forall (m :: * -> *). MonadIO m => [Text] -> m ()
putIOwords [Text
"createSymbolidLink", Path df ra -> Text
forall a. Show a => a -> Text
showT Path df ra
fn, Text
"to", Path df ra -> Text
forall a. Show a => a -> Text
showT Path df ra
tn]
IO () -> ErrIO ()
forall (m :: * -> *) a.
(MonadError m, MonadIO m, ErrorType m ~ Text) =>
IO a -> m a
callIO (IO () -> ErrIO ()) -> IO () -> ErrIO ()
forall a b. (a -> b) -> a -> b
$ FilePath -> FilePath -> IO ()
P.createSymbolicLink (Path df ra -> FilePath
forall df ar. Path df ar -> FilePath
unL Path df ra
fn) (Path df ra -> FilePath
forall df ar. Path df ar -> FilePath
unL Path df ra
tn)
renameLink :: Path df ra -> Path df ra -> ErrIO ()
renameLink :: Path df ra -> Path df ra -> ErrIO ()
renameLink Path df ra
old Path df ra
new = IO () -> ErrIO ()
forall (m :: * -> *) a.
(MonadError m, MonadIO m, ErrorType m ~ Text) =>
IO a -> m a
callIO (IO () -> ErrIO ()) -> IO () -> ErrIO ()
forall a b. (a -> b) -> a -> b
$ FilePath -> FilePath -> IO ()
P.rename (Path df ra -> FilePath
forall df ar. Path df ar -> FilePath
unL Path df ra
old) (Path df ra -> FilePath
forall df ar. Path df ar -> FilePath
unL Path df ra
new)