-- | Provides the 'FilePathDefault' type.
module Shrun.Configuration.Data.FileLogging.FilePathDefault
  ( FilePathDefault (..),
    parseFilePathDefault,
    _FPDefault,
    _FPManual,
  )
where

import Data.Text qualified as T
import FileSystem.OsPath qualified as OsPath
import Shrun.Prelude

-- | OsPath option that includes a default possibility.
data FilePathDefault
  = FPDefault
  | FPManual OsPath
  deriving stock (FilePathDefault -> FilePathDefault -> Bool
(FilePathDefault -> FilePathDefault -> Bool)
-> (FilePathDefault -> FilePathDefault -> Bool)
-> Eq FilePathDefault
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FilePathDefault -> FilePathDefault -> Bool
== :: FilePathDefault -> FilePathDefault -> Bool
$c/= :: FilePathDefault -> FilePathDefault -> Bool
/= :: FilePathDefault -> FilePathDefault -> Bool
Eq, Int -> FilePathDefault -> ShowS
[FilePathDefault] -> ShowS
FilePathDefault -> String
(Int -> FilePathDefault -> ShowS)
-> (FilePathDefault -> String)
-> ([FilePathDefault] -> ShowS)
-> Show FilePathDefault
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FilePathDefault -> ShowS
showsPrec :: Int -> FilePathDefault -> ShowS
$cshow :: FilePathDefault -> String
show :: FilePathDefault -> String
$cshowList :: [FilePathDefault] -> ShowS
showList :: [FilePathDefault] -> ShowS
Show)

instance DecodeTOML FilePathDefault where
  tomlDecoder :: Decoder FilePathDefault
tomlDecoder = Decoder Text
forall a. DecodeTOML a => Decoder a
tomlDecoder Decoder Text
-> (Text -> Decoder FilePathDefault) -> Decoder FilePathDefault
forall a b. Decoder a -> (a -> Decoder b) -> Decoder b
forall (m :: Type -> Type) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> Decoder FilePathDefault
forall (m :: Type -> Type).
MonadFail m =>
Text -> m FilePathDefault
parseFilePathDefault

instance Pretty FilePathDefault where
  pretty :: forall ann. FilePathDefault -> Doc ann
pretty = \case
    FilePathDefault
FPDefault -> Doc ann
"default"
    FPManual OsPath
p -> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc ann) -> String -> Doc ann
forall a b. (a -> b) -> a -> b
$ OsPath -> String
decodeLenient OsPath
p

parseFilePathDefault :: (MonadFail m) => Text -> m FilePathDefault
parseFilePathDefault :: forall (m :: Type -> Type).
MonadFail m =>
Text -> m FilePathDefault
parseFilePathDefault = \case
  Text
"default" -> FilePathDefault -> m FilePathDefault
forall a. a -> m a
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure FilePathDefault
FPDefault
  Text
"" -> String -> m FilePathDefault
forall a. String -> m a
forall (m :: Type -> Type) a. MonadFail m => String -> m a
fail String
"Empty path given for --file-log"
  Text
other -> OsPath -> FilePathDefault
FPManual (OsPath -> FilePathDefault) -> m OsPath -> m FilePathDefault
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> m OsPath
forall (m :: Type -> Type).
(HasCallStack, MonadFail m) =>
String -> m OsPath
OsPath.encodeFail (Text -> String
T.unpack Text
other)
{-# INLINEABLE parseFilePathDefault #-}

_FPDefault :: Prism' FilePathDefault ()
_FPDefault :: Prism' FilePathDefault ()
_FPDefault =
  (() -> FilePathDefault)
-> (FilePathDefault -> Either FilePathDefault ())
-> Prism' FilePathDefault ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
    (FilePathDefault -> () -> FilePathDefault
forall a b. a -> b -> a
const FilePathDefault
FPDefault)
    ( \case
        FilePathDefault
FPDefault -> () -> Either FilePathDefault ()
forall a b. b -> Either a b
Right ()
        FPManual OsPath
p -> FilePathDefault -> Either FilePathDefault ()
forall a b. a -> Either a b
Left (OsPath -> FilePathDefault
FPManual OsPath
p)
    )
{-# INLINE _FPDefault #-}

_FPManual :: Prism' FilePathDefault OsPath
_FPManual :: Prism' FilePathDefault OsPath
_FPManual =
  (OsPath -> FilePathDefault)
-> (FilePathDefault -> Either FilePathDefault OsPath)
-> Prism' FilePathDefault OsPath
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
    OsPath -> FilePathDefault
FPManual
    ( \case
        FPManual OsPath
p -> OsPath -> Either FilePathDefault OsPath
forall a b. b -> Either a b
Right OsPath
p
        FilePathDefault
FPDefault -> FilePathDefault -> Either FilePathDefault OsPath
forall a b. a -> Either a b
Left FilePathDefault
FPDefault
    )
{-# INLINE _FPManual #-}