module System.File.Platform where

import System.IO (IOMode(..), Handle)
import System.Posix.IO.PosixString
    ( defaultFileFlags,
      fdToHandle,
      openFd,
      OpenFileFlags(noctty, nonBlock, creat, append, trunc),
      OpenMode(ReadWrite, ReadOnly, WriteOnly) )
import System.OsPath.Posix ( PosixPath )

-- | Open a file and return the 'Handle'.
openFile :: PosixPath -> IOMode -> IO Handle
openFile :: PosixPath -> IOMode -> IO Handle
openFile PosixPath
fp IOMode
iomode = Fd -> IO Handle
fdToHandle (Fd -> IO Handle) -> IO Fd -> IO Handle
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< case IOMode
iomode of
  IOMode
ReadMode      -> OpenMode -> OpenFileFlags -> IO Fd
open OpenMode
ReadOnly  OpenFileFlags
df
  IOMode
WriteMode     -> OpenMode -> OpenFileFlags -> IO Fd
open OpenMode
WriteOnly OpenFileFlags
df { trunc :: Bool
trunc = Bool
True, creat :: Maybe FileMode
creat = FileMode -> Maybe FileMode
forall a. a -> Maybe a
Just FileMode
0o666 }
  IOMode
AppendMode    -> OpenMode -> OpenFileFlags -> IO Fd
open OpenMode
WriteOnly OpenFileFlags
df { append :: Bool
append = Bool
True, creat :: Maybe FileMode
creat = FileMode -> Maybe FileMode
forall a. a -> Maybe a
Just FileMode
0o666 }
  IOMode
ReadWriteMode -> OpenMode -> OpenFileFlags -> IO Fd
open OpenMode
ReadWrite OpenFileFlags
df { creat :: Maybe FileMode
creat = FileMode -> Maybe FileMode
forall a. a -> Maybe a
Just FileMode
0o666 }
 where
  open :: OpenMode -> OpenFileFlags -> IO Fd
open = PosixPath -> OpenMode -> OpenFileFlags -> IO Fd
openFd PosixPath
fp
  df :: OpenFileFlags
df = OpenFileFlags
defaultFileFlags { noctty :: Bool
noctty = Bool
True, nonBlock :: Bool
nonBlock = Bool
True }

-- | Open an existing file and return the 'Handle'.
openExistingFile :: PosixPath -> IOMode -> IO Handle
openExistingFile :: PosixPath -> IOMode -> IO Handle
openExistingFile PosixPath
fp IOMode
iomode = Fd -> IO Handle
fdToHandle (Fd -> IO Handle) -> IO Fd -> IO Handle
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< case IOMode
iomode of
  IOMode
ReadMode      -> OpenMode -> OpenFileFlags -> IO Fd
open OpenMode
ReadOnly  OpenFileFlags
df
  IOMode
WriteMode     -> OpenMode -> OpenFileFlags -> IO Fd
open OpenMode
WriteOnly OpenFileFlags
df { trunc :: Bool
trunc = Bool
True }
  IOMode
AppendMode    -> OpenMode -> OpenFileFlags -> IO Fd
open OpenMode
WriteOnly OpenFileFlags
df { append :: Bool
append = Bool
True }
  IOMode
ReadWriteMode -> OpenMode -> OpenFileFlags -> IO Fd
open OpenMode
ReadWrite OpenFileFlags
df
 where
  open :: OpenMode -> OpenFileFlags -> IO Fd
open = PosixPath -> OpenMode -> OpenFileFlags -> IO Fd
openFd PosixPath
fp
  df :: OpenFileFlags
df = OpenFileFlags
defaultFileFlags { noctty :: Bool
noctty = Bool
True, nonBlock :: Bool
nonBlock = Bool
True, creat :: Maybe FileMode
creat = Maybe FileMode
forall a. Maybe a
Nothing }