{-# LANGUAGE OverloadedStrings #-}
module Debug.TraceEmbrace.Config.Type.Mode where

import Data.Aeson hiding (Error)
import Data.Generics.Labels ()
import Data.Typeable
import GHC.Generics
import Language.Haskell.TH.Syntax
import Refined

data IoSink
  = StdErrSink
  | StdOutSink
  | FileSink FilePath deriving (IoSink -> IoSink -> Bool
(IoSink -> IoSink -> Bool)
-> (IoSink -> IoSink -> Bool) -> Eq IoSink
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: IoSink -> IoSink -> Bool
== :: IoSink -> IoSink -> Bool
$c/= :: IoSink -> IoSink -> Bool
/= :: IoSink -> IoSink -> Bool
Eq, Int -> IoSink -> ShowS
[IoSink] -> ShowS
IoSink -> FilePath
(Int -> IoSink -> ShowS)
-> (IoSink -> FilePath) -> ([IoSink] -> ShowS) -> Show IoSink
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> IoSink -> ShowS
showsPrec :: Int -> IoSink -> ShowS
$cshow :: IoSink -> FilePath
show :: IoSink -> FilePath
$cshowList :: [IoSink] -> ShowS
showList :: [IoSink] -> ShowS
Show, (forall x. IoSink -> Rep IoSink x)
-> (forall x. Rep IoSink x -> IoSink) -> Generic IoSink
forall x. Rep IoSink x -> IoSink
forall x. IoSink -> Rep IoSink x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. IoSink -> Rep IoSink x
from :: forall x. IoSink -> Rep IoSink x
$cto :: forall x. Rep IoSink x -> IoSink
to :: forall x. Rep IoSink x -> IoSink
Generic, (forall (m :: * -> *). Quote m => IoSink -> m Exp)
-> (forall (m :: * -> *). Quote m => IoSink -> Code m IoSink)
-> Lift IoSink
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => IoSink -> m Exp
forall (m :: * -> *). Quote m => IoSink -> Code m IoSink
$clift :: forall (m :: * -> *). Quote m => IoSink -> m Exp
lift :: forall (m :: * -> *). Quote m => IoSink -> m Exp
$cliftTyped :: forall (m :: * -> *). Quote m => IoSink -> Code m IoSink
liftTyped :: forall (m :: * -> *). Quote m => IoSink -> Code m IoSink
Lift)

instance ToJSON IoSink where
  toEncoding :: IoSink -> Encoding
toEncoding = Options -> IoSink -> Encoding
forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
defaultOptions
instance FromJSON IoSink

data SinkMode
  = TraceDisabled
  | TraceStd
  | TraceUnsafeIo { SinkMode -> IoSink
sink :: IoSink }
  | TraceEvent
  deriving (SinkMode -> SinkMode -> Bool
(SinkMode -> SinkMode -> Bool)
-> (SinkMode -> SinkMode -> Bool) -> Eq SinkMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SinkMode -> SinkMode -> Bool
== :: SinkMode -> SinkMode -> Bool
$c/= :: SinkMode -> SinkMode -> Bool
/= :: SinkMode -> SinkMode -> Bool
Eq, Int -> SinkMode -> ShowS
[SinkMode] -> ShowS
SinkMode -> FilePath
(Int -> SinkMode -> ShowS)
-> (SinkMode -> FilePath) -> ([SinkMode] -> ShowS) -> Show SinkMode
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SinkMode -> ShowS
showsPrec :: Int -> SinkMode -> ShowS
$cshow :: SinkMode -> FilePath
show :: SinkMode -> FilePath
$cshowList :: [SinkMode] -> ShowS
showList :: [SinkMode] -> ShowS
Show, (forall x. SinkMode -> Rep SinkMode x)
-> (forall x. Rep SinkMode x -> SinkMode) -> Generic SinkMode
forall x. Rep SinkMode x -> SinkMode
forall x. SinkMode -> Rep SinkMode x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SinkMode -> Rep SinkMode x
from :: forall x. SinkMode -> Rep SinkMode x
$cto :: forall x. Rep SinkMode x -> SinkMode
to :: forall x. Rep SinkMode x -> SinkMode
Generic, (forall (m :: * -> *). Quote m => SinkMode -> m Exp)
-> (forall (m :: * -> *). Quote m => SinkMode -> Code m SinkMode)
-> Lift SinkMode
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => SinkMode -> m Exp
forall (m :: * -> *). Quote m => SinkMode -> Code m SinkMode
$clift :: forall (m :: * -> *). Quote m => SinkMode -> m Exp
lift :: forall (m :: * -> *). Quote m => SinkMode -> m Exp
$cliftTyped :: forall (m :: * -> *). Quote m => SinkMode -> Code m SinkMode
liftTyped :: forall (m :: * -> *). Quote m => SinkMode -> Code m SinkMode
Lift)

instance ToJSON SinkMode where
  toEncoding :: SinkMode -> Encoding
toEncoding = Options -> SinkMode -> Encoding
forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
defaultOptions
instance FromJSON SinkMode

data SinkModeP

instance Predicate SinkModeP SinkMode where
  validate :: Proxy SinkModeP -> SinkMode -> Maybe RefineException
validate Proxy SinkModeP
p = \case
    SinkMode
TraceDisabled -> Maybe RefineException
forall a. Maybe a
Nothing
    SinkMode
TraceStd -> Maybe RefineException
forall a. Maybe a
Nothing
    SinkMode
TraceEvent -> Maybe RefineException
forall a. Maybe a
Nothing
    TraceUnsafeIo IoSink
s -> case IoSink
s of
      IoSink
StdErrSink -> Maybe RefineException
forall a. Maybe a
Nothing
      IoSink
StdOutSink -> Maybe RefineException
forall a. Maybe a
Nothing
      FileSink FilePath
"" -> TypeRep -> Text -> Maybe RefineException
throwRefineOtherException (Proxy SinkModeP -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep Proxy SinkModeP
p) Text
"Sink path is empty"
      FileSink FilePath
_ -> Maybe RefineException
forall a. Maybe a
Nothing