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:
parent
1de42395d4
commit
2ecde4fea5
3 changed files with 56 additions and 2 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
45
src/HCat/FileInfo.hs
Normal 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{..}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue