{-# LANGUAGE RecordWildCards #-}
-- | The Haskell-friendly interface of @struct fuse_config@.
module System.LibFuse3.FuseConfig where

import Foreign.C (CDouble(CDouble), CInt(CInt), CUInt(CUInt))
import System.Posix.Signals (Signal)
import System.Posix.Types (CGid(CGid), CMode(CMode), CUid(CUid), FileMode, GroupID, UserID)

import qualified System.LibFuse3.Internal.C as C

-- | Configures the filesystem. Passed to `System.LibFuse3.fuseInit`.
--
-- See the module "System.LibFuse3.FuseConfig" for its fields.
data FuseConfig = FuseConfig
  { -- | @set_gid@
    FuseConfig -> Bool
setGid :: Bool
  , -- | @gid@
    FuseConfig -> GroupID
gid :: GroupID
  , -- | @set_uid@
    FuseConfig -> Bool
setUid :: Bool
  , -- | @uid@
    FuseConfig -> UserID
uid :: UserID
  , -- | @set_mode@
    FuseConfig -> Bool
setMode :: Bool
  , -- | @umask@
    FuseConfig -> FileMode
umask :: FileMode
  , -- | @entry_timeout@
    FuseConfig -> Double
entryTimeout :: Double
  , -- | @negative_timeout@
    FuseConfig -> Double
negativeTimeout :: Double
  , -- | @attr_timeout@
    FuseConfig -> Double
attrTimeout :: Double
  , -- | @intr@
    FuseConfig -> Bool
intr :: Bool
  , -- | @intr_signal@
    FuseConfig -> Signal
intrSignal :: Signal
  , -- | @remember@
    FuseConfig -> Int
remember :: Int
  , -- | @hard_remove@
    FuseConfig -> Bool
hardRemove :: Bool
  , -- | @use_ino@
    FuseConfig -> Bool
useIno :: Bool
  , -- | @readdir_ino@
    FuseConfig -> Bool
readdirIno :: Bool
  , -- | @direct_io@
    FuseConfig -> Bool
directIo :: Bool
  , -- | @kernel_cache@
    FuseConfig -> Bool
kernelCache :: Bool
  , -- | @auto_cache@
    FuseConfig -> Bool
autoCache :: Bool
  , -- | @ac_attr_timeout_set@
    FuseConfig -> Bool
acAttrTimeoutSet :: Bool
  , -- | @ac_attr_timeout@
    FuseConfig -> Double
acAttrTimeout :: Double
  , -- | @nullpath_ok@
    FuseConfig -> Bool
nullpathOk :: Bool
  }
  deriving (FuseConfig -> FuseConfig -> Bool
(FuseConfig -> FuseConfig -> Bool)
-> (FuseConfig -> FuseConfig -> Bool) -> Eq FuseConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FuseConfig -> FuseConfig -> Bool
$c/= :: FuseConfig -> FuseConfig -> Bool
== :: FuseConfig -> FuseConfig -> Bool
$c== :: FuseConfig -> FuseConfig -> Bool
Eq, Int -> FuseConfig -> ShowS
[FuseConfig] -> ShowS
FuseConfig -> String
(Int -> FuseConfig -> ShowS)
-> (FuseConfig -> String)
-> ([FuseConfig] -> ShowS)
-> Show FuseConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FuseConfig] -> ShowS
$cshowList :: [FuseConfig] -> ShowS
show :: FuseConfig -> String
$cshow :: FuseConfig -> String
showsPrec :: Int -> FuseConfig -> ShowS
$cshowsPrec :: Int -> FuseConfig -> ShowS
Show)

-- | Converts to the Storable counterpart.
toCFuseConfig :: FuseConfig -> C.FuseConfig
toCFuseConfig :: FuseConfig -> FuseConfig
toCFuseConfig FuseConfig{Bool
Double
Int
UserID
FileMode
GroupID
Signal
nullpathOk :: Bool
acAttrTimeout :: Double
acAttrTimeoutSet :: Bool
autoCache :: Bool
kernelCache :: Bool
directIo :: Bool
readdirIno :: Bool
useIno :: Bool
hardRemove :: Bool
remember :: Int
intrSignal :: Signal
intr :: Bool
attrTimeout :: Double
negativeTimeout :: Double
entryTimeout :: Double
umask :: FileMode
setMode :: Bool
uid :: UserID
setUid :: Bool
gid :: GroupID
setGid :: Bool
nullpathOk :: FuseConfig -> Bool
acAttrTimeout :: FuseConfig -> Double
acAttrTimeoutSet :: FuseConfig -> Bool
autoCache :: FuseConfig -> Bool
kernelCache :: FuseConfig -> Bool
directIo :: FuseConfig -> Bool
readdirIno :: FuseConfig -> Bool
useIno :: FuseConfig -> Bool
hardRemove :: FuseConfig -> Bool
remember :: FuseConfig -> Int
intrSignal :: FuseConfig -> Signal
intr :: FuseConfig -> Bool
attrTimeout :: FuseConfig -> Double
negativeTimeout :: FuseConfig -> Double
entryTimeout :: FuseConfig -> Double
umask :: FuseConfig -> FileMode
setMode :: FuseConfig -> Bool
uid :: FuseConfig -> UserID
setUid :: FuseConfig -> Bool
gid :: FuseConfig -> GroupID
setGid :: FuseConfig -> Bool
..} = FuseConfig :: Signal
-> CUInt
-> Signal
-> CUInt
-> Signal
-> CUInt
-> CDouble
-> CDouble
-> CDouble
-> Signal
-> Signal
-> Signal
-> Signal
-> Signal
-> Signal
-> Signal
-> Signal
-> Signal
-> Signal
-> CDouble
-> Signal
-> FuseConfig
C.FuseConfig
  { setGid :: Signal
C.setGid           = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
setGid
  , gid :: CUInt
C.gid              = Word32 -> CUInt
CUInt (Word32 -> CUInt) -> Word32 -> CUInt
forall a b. (a -> b) -> a -> b
$ (\(CGid Word32
x) -> Word32
x) GroupID
gid
  , setUid :: Signal
C.setUid           = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
setUid
  , uid :: CUInt
C.uid              = Word32 -> CUInt
CUInt (Word32 -> CUInt) -> Word32 -> CUInt
forall a b. (a -> b) -> a -> b
$ (\(CUid Word32
x) -> Word32
x) UserID
uid
  , setMode :: Signal
C.setMode          = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
setMode
  , umask :: CUInt
C.umask            = Word32 -> CUInt
CUInt (Word32 -> CUInt) -> Word32 -> CUInt
forall a b. (a -> b) -> a -> b
$ (\(CMode Word32
x) -> Word32
x) FileMode
umask
  , entryTimeout :: CDouble
C.entryTimeout     = Double -> CDouble
CDouble Double
entryTimeout
  , negativeTimeout :: CDouble
C.negativeTimeout  = Double -> CDouble
CDouble Double
negativeTimeout
  , attrTimeout :: CDouble
C.attrTimeout      = Double -> CDouble
CDouble Double
attrTimeout
  , intr :: Signal
C.intr             = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
intr
  , intrSignal :: Signal
C.intrSignal       = Signal
intrSignal
  , remember :: Signal
C.remember         = Int -> Signal
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
remember
  , hardRemove :: Signal
C.hardRemove       = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
hardRemove
  , useIno :: Signal
C.useIno           = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
useIno
  , readdirIno :: Signal
C.readdirIno       = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
readdirIno
  , directIo :: Signal
C.directIo         = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
directIo
  , kernelCache :: Signal
C.kernelCache      = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
kernelCache
  , autoCache :: Signal
C.autoCache        = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
autoCache
  , acAttrTimeoutSet :: Signal
C.acAttrTimeoutSet = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
acAttrTimeoutSet
  , acAttrTimeout :: CDouble
C.acAttrTimeout    = Double -> CDouble
CDouble Double
acAttrTimeout
  , nullpathOk :: Signal
C.nullpathOk       = Bool -> Signal
forall {p}. Num p => Bool -> p
boolToCInt Bool
nullpathOk
  }
  where
  boolToCInt :: Bool -> p
boolToCInt Bool
b = if Bool
b then p
1 else p
0

-- | Converts from the Storable counterpart.
fromCFuseConfig :: C.FuseConfig -> FuseConfig
fromCFuseConfig :: FuseConfig -> FuseConfig
fromCFuseConfig C.FuseConfig{CUInt
Signal
CDouble
nullpathOk :: Signal
acAttrTimeout :: CDouble
acAttrTimeoutSet :: Signal
autoCache :: Signal
kernelCache :: Signal
directIo :: Signal
readdirIno :: Signal
useIno :: Signal
hardRemove :: Signal
remember :: Signal
intrSignal :: Signal
intr :: Signal
attrTimeout :: CDouble
negativeTimeout :: CDouble
entryTimeout :: CDouble
umask :: CUInt
setMode :: Signal
uid :: CUInt
setUid :: Signal
gid :: CUInt
setGid :: Signal
nullpathOk :: FuseConfig -> Signal
acAttrTimeout :: FuseConfig -> CDouble
acAttrTimeoutSet :: FuseConfig -> Signal
autoCache :: FuseConfig -> Signal
kernelCache :: FuseConfig -> Signal
directIo :: FuseConfig -> Signal
readdirIno :: FuseConfig -> Signal
useIno :: FuseConfig -> Signal
hardRemove :: FuseConfig -> Signal
remember :: FuseConfig -> Signal
intrSignal :: FuseConfig -> Signal
intr :: FuseConfig -> Signal
attrTimeout :: FuseConfig -> CDouble
negativeTimeout :: FuseConfig -> CDouble
entryTimeout :: FuseConfig -> CDouble
umask :: FuseConfig -> CUInt
setMode :: FuseConfig -> Signal
uid :: FuseConfig -> CUInt
setUid :: FuseConfig -> Signal
gid :: FuseConfig -> CUInt
setGid :: FuseConfig -> Signal
..} = FuseConfig :: Bool
-> GroupID
-> Bool
-> UserID
-> Bool
-> FileMode
-> Double
-> Double
-> Double
-> Bool
-> Signal
-> Int
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Double
-> Bool
-> FuseConfig
FuseConfig
  { setGid :: Bool
setGid           = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
setGid
  , gid :: GroupID
gid              = Word32 -> GroupID
CGid (Word32 -> GroupID) -> Word32 -> GroupID
forall a b. (a -> b) -> a -> b
$ CUInt -> Word32
unCUInt CUInt
gid
  , setUid :: Bool
setUid           = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
setUid
  , uid :: UserID
uid              = Word32 -> UserID
CUid (Word32 -> UserID) -> Word32 -> UserID
forall a b. (a -> b) -> a -> b
$ CUInt -> Word32
unCUInt CUInt
uid
  , setMode :: Bool
setMode          = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
setMode
  , umask :: FileMode
umask            = Word32 -> FileMode
CMode (Word32 -> FileMode) -> Word32 -> FileMode
forall a b. (a -> b) -> a -> b
$ CUInt -> Word32
unCUInt CUInt
umask
  , entryTimeout :: Double
entryTimeout     = CDouble -> Double
unCDouble CDouble
entryTimeout
  , negativeTimeout :: Double
negativeTimeout  = CDouble -> Double
unCDouble CDouble
negativeTimeout
  , attrTimeout :: Double
attrTimeout      = CDouble -> Double
unCDouble CDouble
attrTimeout
  , intr :: Bool
intr             = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
intr
  , intrSignal :: Signal
intrSignal       = Signal
intrSignal
  , remember :: Int
remember         = Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int32 -> Int) -> Int32 -> Int
forall a b. (a -> b) -> a -> b
$ Signal -> Int32
unCInt Signal
remember
  , hardRemove :: Bool
hardRemove       = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
hardRemove
  , useIno :: Bool
useIno           = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
useIno
  , readdirIno :: Bool
readdirIno       = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
readdirIno
  , directIo :: Bool
directIo         = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
directIo
  , kernelCache :: Bool
kernelCache      = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
kernelCache
  , autoCache :: Bool
autoCache        = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
autoCache
  , acAttrTimeoutSet :: Bool
acAttrTimeoutSet = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
acAttrTimeoutSet
  , acAttrTimeout :: Double
acAttrTimeout    = CDouble -> Double
unCDouble CDouble
acAttrTimeout
  , nullpathOk :: Bool
nullpathOk       = Signal -> Bool
forall {a}. (Eq a, Num a) => a -> Bool
cintToBool Signal
nullpathOk
  }
  where
  unCDouble :: CDouble -> Double
unCDouble (CDouble Double
x) = Double
x
  unCInt :: Signal -> Int32
unCInt (CInt Int32
x) = Int32
x
  unCUInt :: CUInt -> Word32
unCUInt (CUInt Word32
x) = Word32
x
  cintToBool :: a -> Bool
cintToBool a
x = a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
0