module Shrun.Configuration.Data.FileLogging.FileMode
  ( FileMode (..),
    parseFileMode,
    fileModeMeta,
    toIOMode,
  )
where

import Shrun.Configuration.Default (Default (def))
import Shrun.Prelude
import Shrun.Utils qualified as Utils

-- | File mode.
data FileMode
  = FileModeAppend
  | FileModeRename
  | FileModeWrite
  deriving stock (FileMode
FileMode -> FileMode -> Bounded FileMode
forall a. a -> a -> Bounded a
$cminBound :: FileMode
minBound :: FileMode
$cmaxBound :: FileMode
maxBound :: FileMode
Bounded, Int -> FileMode
FileMode -> Int
FileMode -> [FileMode]
FileMode -> FileMode
FileMode -> FileMode -> [FileMode]
FileMode -> FileMode -> FileMode -> [FileMode]
(FileMode -> FileMode)
-> (FileMode -> FileMode)
-> (Int -> FileMode)
-> (FileMode -> Int)
-> (FileMode -> [FileMode])
-> (FileMode -> FileMode -> [FileMode])
-> (FileMode -> FileMode -> [FileMode])
-> (FileMode -> FileMode -> FileMode -> [FileMode])
-> Enum FileMode
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FileMode -> FileMode
succ :: FileMode -> FileMode
$cpred :: FileMode -> FileMode
pred :: FileMode -> FileMode
$ctoEnum :: Int -> FileMode
toEnum :: Int -> FileMode
$cfromEnum :: FileMode -> Int
fromEnum :: FileMode -> Int
$cenumFrom :: FileMode -> [FileMode]
enumFrom :: FileMode -> [FileMode]
$cenumFromThen :: FileMode -> FileMode -> [FileMode]
enumFromThen :: FileMode -> FileMode -> [FileMode]
$cenumFromTo :: FileMode -> FileMode -> [FileMode]
enumFromTo :: FileMode -> FileMode -> [FileMode]
$cenumFromThenTo :: FileMode -> FileMode -> FileMode -> [FileMode]
enumFromThenTo :: FileMode -> FileMode -> FileMode -> [FileMode]
Enum, FileMode -> FileMode -> Bool
(FileMode -> FileMode -> Bool)
-> (FileMode -> FileMode -> Bool) -> Eq FileMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FileMode -> FileMode -> Bool
== :: FileMode -> FileMode -> Bool
$c/= :: FileMode -> FileMode -> Bool
/= :: FileMode -> FileMode -> Bool
Eq, Int -> FileMode -> ShowS
[FileMode] -> ShowS
FileMode -> String
(Int -> FileMode -> ShowS)
-> (FileMode -> String) -> ([FileMode] -> ShowS) -> Show FileMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FileMode -> ShowS
showsPrec :: Int -> FileMode -> ShowS
$cshow :: FileMode -> String
show :: FileMode -> String
$cshowList :: [FileMode] -> ShowS
showList :: [FileMode] -> ShowS
Show)

instance DecodeTOML FileMode where
  tomlDecoder :: Decoder FileMode
tomlDecoder = Decoder Text -> Decoder FileMode
forall (m :: Type -> Type). MonadFail m => m Text -> m FileMode
parseFileMode Decoder Text
forall a. DecodeTOML a => Decoder a
tomlDecoder

instance Pretty FileMode where
  pretty :: forall ann. FileMode -> Doc ann
pretty = \case
    FileMode
FileModeAppend -> Doc ann
"append"
    FileMode
FileModeRename -> Doc ann
"rename"
    FileMode
FileModeWrite -> Doc ann
"write"

parseFileMode :: (MonadFail m) => m Text -> m FileMode
parseFileMode :: forall (m :: Type -> Type). MonadFail m => m Text -> m FileMode
parseFileMode = (m Text -> (Text -> m FileMode) -> m FileMode
forall a b. m a -> (a -> m b) -> m b
forall (m :: Type -> Type) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> (Bool, [Text]) -> Text -> m FileMode
forall a (m :: Type -> Type).
(Bounded a, Enum a, MonadFail m, Pretty a) =>
Text -> (Bool, [Text]) -> Text -> m a
Utils.inversePrettyFail Text
"file-mode" (Bool, [Text])
forall a. IsString a => (Bool, [a])
fileModeMeta)
{-# INLINEABLE parseFileMode #-}

instance Default FileMode where
  def :: FileMode
def = FileMode
FileModeWrite

fileModeMeta :: (IsString a) => Tuple2 Bool (List a)
fileModeMeta :: forall a. IsString a => (Bool, [a])
fileModeMeta = (Bool
False, [a
"append", a
"rename", a
"write"])

toIOMode :: FileMode -> Bool
toIOMode :: FileMode -> Bool
toIOMode = \case
  FileMode
FileModeAppend -> Bool
True
  FileMode
FileModeRename -> Bool
False
  FileMode
FileModeWrite -> Bool
False