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

View file

@ -18,6 +18,7 @@ extra-source-files:
library library
exposed-modules: exposed-modules:
HCat HCat
HCat.FileInfo
HCat.Internal HCat.Internal
other-modules: other-modules:
Paths_hcat Paths_hcat
@ -30,8 +31,10 @@ library
ghc-options: -Wall -fdefer-typed-holes ghc-options: -Wall -fdefer-typed-holes
build-depends: build-depends:
base >=4.13 && <5 base >=4.13 && <5
, directory
, process , process
, text , text
, time
default-language: GHC2021 default-language: GHC2021
executable hcat executable hcat
@ -47,7 +50,9 @@ executable hcat
ghc-options: -Wall -fdefer-typed-holes ghc-options: -Wall -fdefer-typed-holes
build-depends: build-depends:
base >=4.13 && <5 base >=4.13 && <5
, directory
, hcat , hcat
, time
default-language: GHC2021 default-language: GHC2021
test-suite doctest test-suite doctest
@ -66,7 +71,9 @@ test-suite doctest
doctest:doctest doctest:doctest
build-depends: build-depends:
base >=4.13 && <5 base >=4.13 && <5
, directory
, process , process
, time
default-language: Haskell2010 default-language: Haskell2010
test-suite spec test-suite spec
@ -88,7 +95,9 @@ test-suite spec
build-depends: build-depends:
QuickCheck QuickCheck
, base >=4.13 && <5 , base >=4.13 && <5
, directory
, hcat , hcat
, hspec , hspec
, quickcheck-instances , quickcheck-instances
, time
default-language: GHC2021 default-language: GHC2021

View file

@ -11,9 +11,9 @@ extra-source-files:
dependencies: dependencies:
- base >= 4.13 && < 5 - base >= 4.13 && < 5
- time
- directory
# - bytestring # - bytestring
# - time
# - directory
ghc-options: ghc-options:
- -Wall - -Wall

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{..}