fs-api-0.3.0.1: Abstract interface for the file system
Safe HaskellSafe-Inferred
LanguageHaskell2010

System.FS.API.Types

Synopsis

Modes

data AllowExisting #

When opening a file:

Constructors

AllowExisting

The file may already exist. If it does, it is reopened. If it doesn't, it is created.

MustBeNew

The file must not yet exist. If it does, an error (FsResourceAlreadyExist) is thrown.

MustExist

The file must already exist. If it does not, an error (FsResourceDoesNotExist) is thrown.

Note: If opening a file in ReadMode, then the file must exist or an exception is thrown.

Instances

Instances details
Show AllowExisting # 
Instance details

Defined in System.FS.API.Types

Condense AllowExisting # 
Instance details

Defined in System.FS.API.Types

Eq AllowExisting # 
Instance details

Defined in System.FS.API.Types

data OpenMode #

How to hOpen a new file.

Each mode of file operation has an associated AllowExisting parameter which specifies the semantics of how to handle the existence or non-existence of the file.

Notably however, opening a file in read mode with the ReadMode value implicitly has the associated AllowExisting value of MustExist. This is because opening a non-existing file in ReadMode provides access to exactly 0 bytes of data and is hence a useless operation.

Instances

Instances details
Show OpenMode # 
Instance details

Defined in System.FS.API.Types

Condense OpenMode # 
Instance details

Defined in System.FS.API.Types

Methods

condense :: OpenMode -> String #

Eq OpenMode # 
Instance details

Defined in System.FS.API.Types

data SeekMode #

A mode that determines the effect of hSeek hdl mode i.

Constructors

AbsoluteSeek

the position of hdl is set to i.

RelativeSeek

the position of hdl is set to offset i from the current position.

SeekFromEnd

the position of hdl is set to offset i from the end of the file.

Instances

Instances details
Enum SeekMode

Since: base-4.2.0.0

Instance details

Defined in GHC.IO.Device

Ix SeekMode

Since: base-4.2.0.0

Instance details

Defined in GHC.IO.Device

Read SeekMode

Since: base-4.2.0.0

Instance details

Defined in GHC.IO.Device

Show SeekMode

Since: base-4.2.0.0

Instance details

Defined in GHC.IO.Device

Condense SeekMode # 
Instance details

Defined in System.FS.Condense

Methods

condense :: SeekMode -> String #

Eq SeekMode

Since: base-4.2.0.0

Instance details

Defined in GHC.IO.Device

Ord SeekMode

Since: base-4.2.0.0

Instance details

Defined in GHC.IO.Device

Paths

newtype MountPoint #

Mount point

FsPaths are not absolute paths, but must be interpreted with respect to a particualar mount point.

Constructors

MountPoint FilePath 

fsPathFromList :: [Text] -> FsPath #

Create a path from a list of directory/file names. All of the names should be non-empty.

fsPathInit :: HasCallStack => FsPath -> FsPath #

Drop the final component of the path

Undefined if the path is empty.

fsPathSplit :: FsPath -> Maybe (FsPath, Text) #

Split FsPath is essentially (init fp, last fp)

Like init and last, Nothing if empty.

mkFsPath :: [String] -> FsPath #

Constructor for FsPath ensures path is in normal form

(<.>) :: FsPath -> String -> FsPath infixr 7 #

Add an extension, even if there is already one there.

This works similarly to <.>.

addExtension :: FsPath -> String -> FsPath #

An alias for <.>.

(</>) :: FsPath -> FsPath -> FsPath infixr 5 #

Combine two paths with a path separator.

This works similarly to </>, but since the arguments are relative paths, the corner cases for </> do not apply. Specifically, the second path will never start with a path separator or a drive letter, so the result is simply the concatenation of the two paths.

If either operand is empty, the other operand is returned. The result of combining two empty paths is the empty path

combine :: FsPath -> FsPath -> FsPath #

An alias for </>.

opaque

data FsPath #

A relative path.

Invariant

The user of this library is tasked with picking sensible names of directories/files on a path. Amongst others, the following should hold:

  • Names are non-empty
  • Names are monotonic, i.e., they are not equal to ..
  • Names should not contain path separators or drive letters

In particular, names that satisfy these invariants should result in an FsPath that remains relative to the HasFS instance root. For example, an FsPath ["/"] would try to access the root folder, which is most likely outside of the scope of the HasFS instance.

".." should not be used because fs-sim will not be able to follow these types of back-links. fs-sim will interpret ".." as a directory name instead.

Instances

Instances details
Generic FsPath # 
Instance details

Defined in System.FS.API.Types

Associated Types

type Rep FsPath :: Type -> Type #

Methods

from :: FsPath -> Rep FsPath x #

to :: Rep FsPath x -> FsPath #

Show FsPath # 
Instance details

Defined in System.FS.API.Types

NFData FsPath # 
Instance details

Defined in System.FS.API.Types

Methods

rnf :: FsPath -> () #

Condense FsPath # 
Instance details

Defined in System.FS.API.Types

Methods

condense :: FsPath -> String #

Eq FsPath # 
Instance details

Defined in System.FS.API.Types

Methods

(==) :: FsPath -> FsPath -> Bool #

(/=) :: FsPath -> FsPath -> Bool #

Ord FsPath # 
Instance details

Defined in System.FS.API.Types

type Rep FsPath # 
Instance details

Defined in System.FS.API.Types

type Rep FsPath = D1 ('MetaData "FsPath" "System.FS.API.Types" "fs-api-0.3.0.1-2cb97dc20134bb0499ec0b839c40399c3d0ff8d7259174937f5faaf0043d284e" 'True) (C1 ('MetaCons "UnsafeFsPath" 'PrefixI 'True) (S1 ('MetaSel ('Just "fsPathToList") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Text])))

Handles

data Handle h #

Constructors

Handle 

Fields

  • handleRaw :: !h

    The raw underlying handle

  • handlePath :: !FsPath

    The path corresponding to this handle

    This is primarily useful for error reporting.

Instances

Instances details
Generic (Handle h) # 
Instance details

Defined in System.FS.API.Types

Associated Types

type Rep (Handle h) :: Type -> Type #

Methods

from :: Handle h -> Rep (Handle h) x #

to :: Rep (Handle h) x -> Handle h #

Show (Handle h) # 
Instance details

Defined in System.FS.API.Types

Methods

showsPrec :: Int -> Handle h -> ShowS #

show :: Handle h -> String #

showList :: [Handle h] -> ShowS #

NFData h => NFData (Handle h) # 
Instance details

Defined in System.FS.API.Types

Methods

rnf :: Handle h -> () #

Condense (Handle h) # 
Instance details

Defined in System.FS.API.Types

Methods

condense :: Handle h -> String #

Eq h => Eq (Handle h) # 
Instance details

Defined in System.FS.API.Types

Methods

(==) :: Handle h -> Handle h -> Bool #

(/=) :: Handle h -> Handle h -> Bool #

type Rep (Handle h) # 
Instance details

Defined in System.FS.API.Types

type Rep (Handle h) = D1 ('MetaData "Handle" "System.FS.API.Types" "fs-api-0.3.0.1-2cb97dc20134bb0499ec0b839c40399c3d0ff8d7259174937f5faaf0043d284e" 'False) (C1 ('MetaCons "Handle" 'PrefixI 'True) (S1 ('MetaSel ('Just "handleRaw") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 h) :*: S1 ('MetaSel ('Just "handlePath") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 FsPath)))

Offset

newtype AbsOffset #

Constructors

AbsOffset 

Fields

Instances

Instances details
Bounded AbsOffset # 
Instance details

Defined in System.FS.API.Types

Enum AbsOffset # 
Instance details

Defined in System.FS.API.Types

Num AbsOffset # 
Instance details

Defined in System.FS.API.Types

Show AbsOffset # 
Instance details

Defined in System.FS.API.Types

Eq AbsOffset # 
Instance details

Defined in System.FS.API.Types

Ord AbsOffset # 
Instance details

Defined in System.FS.API.Types

Errors

data FsError #

Constructors

FsError 

Fields

Instances

Instances details
Exception FsError # 
Instance details

Defined in System.FS.API.Types

Show FsError # 
Instance details

Defined in System.FS.API.Types

data FsErrorPath #

For better error reporting to the end user, we want to include the mount point of the file. But the mountpoint may not always be available, like when we mock the fs or we simulate fs errors.

Instances

Instances details
Show FsErrorPath # 
Instance details

Defined in System.FS.API.Types

Condense FsErrorPath # 
Instance details

Defined in System.FS.API.Types

Eq FsErrorPath #

We only care to compare the FsPath, because the MountPoint may not exist.

Instance details

Defined in System.FS.API.Types

data FsErrorType #

Instances

Instances details
Show FsErrorType # 
Instance details

Defined in System.FS.API.Types

Eq FsErrorType # 
Instance details

Defined in System.FS.API.Types

sameFsError :: FsError -> FsError -> Bool #

Check if two errors are semantically the same error

This ignores the error string, the errno, and the callstack.

From IOError to FsError

ioToFsError :: HasCallStack => FsErrorPath -> IOError -> FsError #

Translate exceptions thrown by IO functions to FsError

We take the FsPath as an argument. We could try to translate back from a FilePath to an FsPath (given a MountPoint), but we know the FsPath at all times anyway and not all IO exceptions actually include a filepath.

ioToFsErrorType :: IOError -> FsErrorType #

Assign an FsErrorType to the given IOError.

Note that we don't always use the classification made by errnoToIOError (also see Error) because it combines some errors into one IOErrorType, e.g., EMFILE (too many open files) and ENOSPC (no space left on device) both result in ResourceExhausted while we want to keep them separate. For this reason, we do a classification of our own based on the errno while sometimes deferring to the existing classification.

See the ERRNO(3) man page for the meaning of the different errnos.