Implement getFileInfo to retrieve meta data

getFileInfo returns a record containing meta data about the given file,
such as permissions, last modification time and time. We'll use this
action to fill a neat status bar.
This commit is contained in:
Alexander Kobjolke 2023-09-01 08:37:54 +02:00
parent 1de42395d4
commit 2ecde4fea5
3 changed files with 56 additions and 2 deletions

45
src/HCat/FileInfo.hs Normal file
View file

@ -0,0 +1,45 @@
{-# LANGUAGE RecordWildCards #-}
-- | FileInfo defines a data type that captures important information about a
-- file such as timestamps and permissions.
module HCat.FileInfo (FileInfo, getFileInfo) where
import Data.Text (Text)
import Data.Text qualified as T
import Data.Time.Clock (UTCTime)
import System.Directory (getFileSize, getModificationTime, getPermissions)
import System.Directory qualified as Directory
data FileInfo = FileInfo
{ filePath :: Text
, fileSize :: Integer
, fileMTime :: UTCTime
, fileReadable :: Bool
, fileWritable :: Bool
, fileExecutable :: Bool
}
deriving (Show)
-- | @getFileInfo@ retrieves several meta data about the given file.
--
-- >>> info <- getFileInfo "src/HCat/FileInfo.hs"
-- >>> filePath info
-- "src/HCat/FileInfo.hs"
-- >>> fileSize info > 0
-- True
-- >>> fileReadable info
-- True
-- >>> fileExecutable info
-- False
getFileInfo :: FilePath -> IO FileInfo
getFileInfo path = do
perms <- getPermissions path
fileSize <- getFileSize path
fileMTime <- getModificationTime path
let fileReadable = Directory.readable perms
fileWritable = Directory.writable perms
fileExecutable = Directory.executable perms
filePath = T.pack path
return FileInfo{..}