----------------------------------------------------------------------
--
-- Module      :  uniform-FileIO
-- Copyright   :  andrew u frank -
--
----------------------------------------------------------------------

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}

-- | the routines to take apart the file status
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 
-- (ErrIO, callIO, putIOwords, showT)
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 ra -> ErrIO P.FileStatus
-- getFileStatus :: (Control.Monad.Error.Class.MonadError m,
--  Control.Monad.IO.Class.MonadIO m,
--  Control.Monad.Error.Class.ErrorType m ~ Data.Text.Internal.Text)
--     => Path df ar -> m P.FileStatus
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)