Safe Haskell | None |
---|---|
Language | Haskell2010 |
Hackage.Security.Util.Path
Contents
Description
A more type-safe version of file paths
This module is intended to replace imports of System.FilePath, and additionally exports thin wrappers around common IO functions. To facilitate importing this module unqualified we also re-export some definitions from System.IO (importing both would likely lead to name clashes).
Note that his module does not import any other modules from Hackage.Security; everywhere else we use Path instead of FilePath directly.
Synopsis
- newtype Path a = Path FilePath
- castRoot :: Path root -> Path root'
- takeDirectory :: Path a -> Path a
- takeFileName :: Path a -> String
- (<.>) :: Path a -> String -> Path a
- splitExtension :: Path a -> (Path a, String)
- takeExtension :: Path a -> String
- data Unrooted
- (</>) :: Path a -> Path Unrooted -> Path a
- rootPath :: Path Unrooted -> Path root
- unrootPath :: Path root -> Path Unrooted
- toUnrootedFilePath :: Path Unrooted -> FilePath
- fromUnrootedFilePath :: FilePath -> Path Unrooted
- fragment :: String -> Path Unrooted
- joinFragments :: [String] -> Path Unrooted
- splitFragments :: Path Unrooted -> [String]
- isPathPrefixOf :: Path Unrooted -> Path Unrooted -> Bool
- data Relative
- data Absolute
- data HomeDir
- class FsRoot root where
- toAbsoluteFilePath :: Path root -> IO FilePath
- data FsPath = FsRoot root => FsPath (Path root)
- toFilePath :: Path Absolute -> FilePath
- fromFilePath :: FilePath -> FsPath
- makeAbsolute :: FsPath -> IO (Path Absolute)
- fromAbsoluteFilePath :: FilePath -> Path Absolute
- withFile :: FsRoot root => Path root -> IOMode -> (Handle -> IO r) -> IO r
- openTempFile' :: FsRoot root => Path root -> String -> IO (Path Absolute, Handle)
- readLazyByteString :: FsRoot root => Path root -> IO ByteString
- readStrictByteString :: FsRoot root => Path root -> IO ByteString
- writeLazyByteString :: FsRoot root => Path root -> ByteString -> IO ()
- writeStrictByteString :: FsRoot root => Path root -> ByteString -> IO ()
- copyFile :: (FsRoot root, FsRoot root') => Path root -> Path root' -> IO ()
- createDirectory :: FsRoot root => Path root -> IO ()
- createDirectoryIfMissing :: FsRoot root => Bool -> Path root -> IO ()
- removeDirectory :: FsRoot root => Path root -> IO ()
- doesFileExist :: FsRoot root => Path root -> IO Bool
- doesDirectoryExist :: FsRoot root => Path root -> IO Bool
- getModificationTime :: FsRoot root => Path root -> IO UTCTime
- removeFile :: FsRoot root => Path root -> IO ()
- getTemporaryDirectory :: IO (Path Absolute)
- getDirectoryContents :: FsRoot root => Path root -> IO [Path Unrooted]
- getRecursiveContents :: FsRoot root => Path root -> IO [Path Unrooted]
- renameFile :: (FsRoot root, FsRoot root') => Path root -> Path root' -> IO ()
- getCurrentDirectory :: IO (Path Absolute)
- data Tar
- tarIndexLookup :: TarIndex -> Path Tar -> Maybe TarIndexEntry
- tarAppend :: (FsRoot root, FsRoot root') => Path root -> Path root' -> [Path Tar] -> IO ()
- data Web
- toURIPath :: FilePath -> Path Web
- fromURIPath :: Path Web -> FilePath
- uriPath :: URI -> Path Web
- modifyUriPath :: URI -> (Path Web -> Path Web) -> URI
- data IOMode
- data BufferMode
- = NoBuffering
- | LineBuffering
- | BlockBuffering (Maybe Int)
- data Handle
- data SeekMode
- hSetBuffering :: Handle -> BufferMode -> IO ()
- hClose :: Handle -> IO ()
- hFileSize :: Handle -> IO Integer
- hSeek :: Handle -> SeekMode -> Integer -> IO ()
Paths
Paths
A Path
is simply a FilePath
with a type-level tag indicating where this
path is rooted (relative to the current directory, absolute path, relative to
a web domain, whatever). Most operations on Path
are just lifted versions
of the operations on the underlying FilePath
. The tag however allows us to
give a lot of operations a more meaningful type. For instance, it does not
make sense to append two absolute paths together; instead, we can only append
an unrooted path to another path. It also means we avoid bugs where we use
one kind of path where we expect another.
Constructors
Path FilePath |
Instances
Monad m => FromObjectKey m (Path root) Source # | |
Defined in Hackage.Security.Util.JSON Methods fromObjectKey :: String -> m (Maybe (Path root)) Source # | |
Monad m => ToObjectKey m (Path root) Source # | |
Defined in Hackage.Security.Util.JSON Methods toObjectKey :: Path root -> m String Source # | |
Eq (Path a) Source # | |
Ord (Path a) Source # | |
Show (Path a) Source # | |
Pretty (Path Tar) Source # | |
Pretty (Path HomeDir) Source # | |
Pretty (Path Absolute) Source # | |
Pretty (Path Relative) Source # | |
Pretty (Path Unrooted) Source # | |
Pretty (Path CacheRoot) Source # | |
Pretty (Path IndexRoot) Source # | |
Pretty (Path RepoRoot) Source # | |
castRoot :: Path root -> Path root' Source #
Reinterpret the root of a path
This literally just changes the type-level tag; use with caution!
FilePath-like operations on paths with arbitrary roots
takeDirectory :: Path a -> Path a Source #
takeFileName :: Path a -> String Source #
splitExtension :: Path a -> (Path a, String) Source #
takeExtension :: Path a -> String Source #
Unrooted paths
Type-level tag for unrooted paths
Unrooted paths need a root before they can be interpreted.
rootPath :: Path Unrooted -> Path root Source #
Reinterpret an unrooted path
This is an alias for castRoot
; see comments there.
unrootPath :: Path root -> Path Unrooted Source #
Forget a path's root
This is an alias for castRoot
; see comments there.
toUnrootedFilePath :: Path Unrooted -> FilePath Source #
Convert a relative/unrooted Path to a FilePath (using POSIX style directory separators).
See also toAbsoluteFilePath
fromUnrootedFilePath :: FilePath -> Path Unrooted Source #
Convert from a relative/unrooted FilePath (using POSIX style directory separators).
joinFragments :: [String] -> Path Unrooted Source #
splitFragments :: Path Unrooted -> [String] Source #
File-system paths
class FsRoot root where Source #
A file system root can be interpreted as an (absolute) FilePath
Methods
toAbsoluteFilePath :: Path root -> IO FilePath Source #
Convert a Path to an absolute FilePath (using native style directory separators).
Instances
FsRoot HomeDir Source # | |
Defined in Hackage.Security.Util.Path Methods toAbsoluteFilePath :: Path HomeDir -> IO FilePath Source # | |
FsRoot Absolute Source # | |
Defined in Hackage.Security.Util.Path Methods toAbsoluteFilePath :: Path Absolute -> IO FilePath Source # | |
FsRoot Relative Source # | |
Defined in Hackage.Security.Util.Path Methods toAbsoluteFilePath :: Path Relative -> IO FilePath Source # |
Abstract over a file system root
see fromFilePath
Conversions
toFilePath :: Path Absolute -> FilePath Source #
fromFilePath :: FilePath -> FsPath Source #
fromAbsoluteFilePath :: FilePath -> Path Absolute Source #
Wrappers around System.IO
withFile :: FsRoot root => Path root -> IOMode -> (Handle -> IO r) -> IO r Source #
Wrapper around withFile
openTempFile' :: FsRoot root => Path root -> String -> IO (Path Absolute, Handle) Source #
Wrapper around openBinaryTempFileWithDefaultPermissions
NOTE: The caller is responsible for cleaning up the temporary file.
Wrappers around Data.ByteString
readLazyByteString :: FsRoot root => Path root -> IO ByteString Source #
readStrictByteString :: FsRoot root => Path root -> IO ByteString Source #
writeLazyByteString :: FsRoot root => Path root -> ByteString -> IO () Source #
writeStrictByteString :: FsRoot root => Path root -> ByteString -> IO () Source #
Wrappers around System.Directory
createDirectory :: FsRoot root => Path root -> IO () Source #
createDirectoryIfMissing :: FsRoot root => Bool -> Path root -> IO () Source #
removeDirectory :: FsRoot root => Path root -> IO () Source #
doesFileExist :: FsRoot root => Path root -> IO Bool Source #
doesDirectoryExist :: FsRoot root => Path root -> IO Bool Source #
getModificationTime :: FsRoot root => Path root -> IO UTCTime Source #
removeFile :: FsRoot root => Path root -> IO () Source #
getTemporaryDirectory :: IO (Path Absolute) Source #
getDirectoryContents :: FsRoot root => Path root -> IO [Path Unrooted] Source #
Return the immediate children of a directory
Filters out "."
and ".."
.
getRecursiveContents :: FsRoot root => Path root -> IO [Path Unrooted] Source #
Recursive traverse a directory structure
Returns a set of paths relative to the directory specified. The list is lazily constructed, so that directories are only read when required. (This is also essential to ensure that this function does not build the entire result in memory before returning, potentially running out of heap.)
getCurrentDirectory :: IO (Path Absolute) Source #
Wrappers around Codec.Archive.Tar
tarIndexLookup :: TarIndex -> Path Tar -> Maybe TarIndexEntry Source #
Wrappers around Network.URI
fromURIPath :: Path Web -> FilePath Source #
Re-exports
Constructors
ReadMode | |
WriteMode | |
AppendMode | |
ReadWriteMode |
Instances
Enum IOMode | |
Defined in GHC.IO.IOMode | |
Eq IOMode | |
Ord IOMode | |
Read IOMode | |
Defined in GHC.IO.IOMode | |
Show IOMode | |
Ix IOMode | |
data BufferMode #
Constructors
NoBuffering | |
LineBuffering | |
BlockBuffering (Maybe Int) |
Instances
Eq BufferMode | |
Defined in GHC.IO.Handle.Types | |
Ord BufferMode | |
Defined in GHC.IO.Handle.Types Methods compare :: BufferMode -> BufferMode -> Ordering (<) :: BufferMode -> BufferMode -> Bool (<=) :: BufferMode -> BufferMode -> Bool (>) :: BufferMode -> BufferMode -> Bool (>=) :: BufferMode -> BufferMode -> Bool max :: BufferMode -> BufferMode -> BufferMode min :: BufferMode -> BufferMode -> BufferMode | |
Read BufferMode | |
Defined in GHC.IO.Handle.Types Methods readsPrec :: Int -> ReadS BufferMode readList :: ReadS [BufferMode] readPrec :: ReadPrec BufferMode readListPrec :: ReadPrec [BufferMode] | |
Show BufferMode | |
Defined in GHC.IO.Handle.Types Methods showsPrec :: Int -> BufferMode -> ShowS show :: BufferMode -> String showList :: [BufferMode] -> ShowS |
Constructors
AbsoluteSeek | |
RelativeSeek | |
SeekFromEnd |
Instances
Enum SeekMode | |
Defined in GHC.IO.Device | |
Eq SeekMode | |
Ord SeekMode | |
Read SeekMode | |
Defined in GHC.IO.Device | |
Show SeekMode | |
Ix SeekMode | |
Defined in GHC.IO.Device |
hSetBuffering :: Handle -> BufferMode -> IO () #