module System.Nix.Store.Remote.Types.Logger
  ( Field(..)
  , Trace(..)
  , BasicError(..)
  , ErrorInfo(..)
  , Logger(..)
  , LoggerOpCode(..)
  , loggerOpCodeToWord64
  , word64ToLoggerOpCode
  , isError
  ) where

import Data.ByteString (ByteString)
import Data.Text (Text)
import Data.Word (Word64)
import GHC.Generics
import System.Nix.Store.Remote.Types.Activity (Activity, ActivityID, ActivityResult)
import System.Nix.Store.Remote.Types.Verbosity (Verbosity)

data Field
  = Field_LogStr Text
  | Field_LogInt Int
  deriving (Field -> Field -> Bool
(Field -> Field -> Bool) -> (Field -> Field -> Bool) -> Eq Field
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Field -> Field -> Bool
== :: Field -> Field -> Bool
$c/= :: Field -> Field -> Bool
/= :: Field -> Field -> Bool
Eq, (forall x. Field -> Rep Field x)
-> (forall x. Rep Field x -> Field) -> Generic Field
forall x. Rep Field x -> Field
forall x. Field -> Rep Field x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Field -> Rep Field x
from :: forall x. Field -> Rep Field x
$cto :: forall x. Rep Field x -> Field
to :: forall x. Rep Field x -> Field
Generic, Eq Field
Eq Field =>
(Field -> Field -> Ordering)
-> (Field -> Field -> Bool)
-> (Field -> Field -> Bool)
-> (Field -> Field -> Bool)
-> (Field -> Field -> Bool)
-> (Field -> Field -> Field)
-> (Field -> Field -> Field)
-> Ord Field
Field -> Field -> Bool
Field -> Field -> Ordering
Field -> Field -> Field
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Field -> Field -> Ordering
compare :: Field -> Field -> Ordering
$c< :: Field -> Field -> Bool
< :: Field -> Field -> Bool
$c<= :: Field -> Field -> Bool
<= :: Field -> Field -> Bool
$c> :: Field -> Field -> Bool
> :: Field -> Field -> Bool
$c>= :: Field -> Field -> Bool
>= :: Field -> Field -> Bool
$cmax :: Field -> Field -> Field
max :: Field -> Field -> Field
$cmin :: Field -> Field -> Field
min :: Field -> Field -> Field
Ord, Int -> Field -> ShowS
[Field] -> ShowS
Field -> String
(Int -> Field -> ShowS)
-> (Field -> String) -> ([Field] -> ShowS) -> Show Field
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Field -> ShowS
showsPrec :: Int -> Field -> ShowS
$cshow :: Field -> String
show :: Field -> String
$cshowList :: [Field] -> ShowS
showList :: [Field] -> ShowS
Show)

-- | Error trace
data Trace = Trace
  { Trace -> Maybe Int
tracePosition :: Maybe Int -- Error position, Nix always writes 0 here
  , Trace -> Text
traceHint :: Text
  }
  deriving (Trace -> Trace -> Bool
(Trace -> Trace -> Bool) -> (Trace -> Trace -> Bool) -> Eq Trace
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Trace -> Trace -> Bool
== :: Trace -> Trace -> Bool
$c/= :: Trace -> Trace -> Bool
/= :: Trace -> Trace -> Bool
Eq, (forall x. Trace -> Rep Trace x)
-> (forall x. Rep Trace x -> Trace) -> Generic Trace
forall x. Rep Trace x -> Trace
forall x. Trace -> Rep Trace x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Trace -> Rep Trace x
from :: forall x. Trace -> Rep Trace x
$cto :: forall x. Rep Trace x -> Trace
to :: forall x. Rep Trace x -> Trace
Generic, Eq Trace
Eq Trace =>
(Trace -> Trace -> Ordering)
-> (Trace -> Trace -> Bool)
-> (Trace -> Trace -> Bool)
-> (Trace -> Trace -> Bool)
-> (Trace -> Trace -> Bool)
-> (Trace -> Trace -> Trace)
-> (Trace -> Trace -> Trace)
-> Ord Trace
Trace -> Trace -> Bool
Trace -> Trace -> Ordering
Trace -> Trace -> Trace
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Trace -> Trace -> Ordering
compare :: Trace -> Trace -> Ordering
$c< :: Trace -> Trace -> Bool
< :: Trace -> Trace -> Bool
$c<= :: Trace -> Trace -> Bool
<= :: Trace -> Trace -> Bool
$c> :: Trace -> Trace -> Bool
> :: Trace -> Trace -> Bool
$c>= :: Trace -> Trace -> Bool
>= :: Trace -> Trace -> Bool
$cmax :: Trace -> Trace -> Trace
max :: Trace -> Trace -> Trace
$cmin :: Trace -> Trace -> Trace
min :: Trace -> Trace -> Trace
Ord, Int -> Trace -> ShowS
[Trace] -> ShowS
Trace -> String
(Int -> Trace -> ShowS)
-> (Trace -> String) -> ([Trace] -> ShowS) -> Show Trace
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Trace -> ShowS
showsPrec :: Int -> Trace -> ShowS
$cshow :: Trace -> String
show :: Trace -> String
$cshowList :: [Trace] -> ShowS
showList :: [Trace] -> ShowS
Show)

data BasicError = BasicError
  { BasicError -> Int
basicErrorExitStatus :: Int
  , BasicError -> Text
basicErrorMessage :: Text
  }
  deriving (BasicError -> BasicError -> Bool
(BasicError -> BasicError -> Bool)
-> (BasicError -> BasicError -> Bool) -> Eq BasicError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BasicError -> BasicError -> Bool
== :: BasicError -> BasicError -> Bool
$c/= :: BasicError -> BasicError -> Bool
/= :: BasicError -> BasicError -> Bool
Eq, (forall x. BasicError -> Rep BasicError x)
-> (forall x. Rep BasicError x -> BasicError) -> Generic BasicError
forall x. Rep BasicError x -> BasicError
forall x. BasicError -> Rep BasicError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BasicError -> Rep BasicError x
from :: forall x. BasicError -> Rep BasicError x
$cto :: forall x. Rep BasicError x -> BasicError
to :: forall x. Rep BasicError x -> BasicError
Generic, Eq BasicError
Eq BasicError =>
(BasicError -> BasicError -> Ordering)
-> (BasicError -> BasicError -> Bool)
-> (BasicError -> BasicError -> Bool)
-> (BasicError -> BasicError -> Bool)
-> (BasicError -> BasicError -> Bool)
-> (BasicError -> BasicError -> BasicError)
-> (BasicError -> BasicError -> BasicError)
-> Ord BasicError
BasicError -> BasicError -> Bool
BasicError -> BasicError -> Ordering
BasicError -> BasicError -> BasicError
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: BasicError -> BasicError -> Ordering
compare :: BasicError -> BasicError -> Ordering
$c< :: BasicError -> BasicError -> Bool
< :: BasicError -> BasicError -> Bool
$c<= :: BasicError -> BasicError -> Bool
<= :: BasicError -> BasicError -> Bool
$c> :: BasicError -> BasicError -> Bool
> :: BasicError -> BasicError -> Bool
$c>= :: BasicError -> BasicError -> Bool
>= :: BasicError -> BasicError -> Bool
$cmax :: BasicError -> BasicError -> BasicError
max :: BasicError -> BasicError -> BasicError
$cmin :: BasicError -> BasicError -> BasicError
min :: BasicError -> BasicError -> BasicError
Ord, Int -> BasicError -> ShowS
[BasicError] -> ShowS
BasicError -> String
(Int -> BasicError -> ShowS)
-> (BasicError -> String)
-> ([BasicError] -> ShowS)
-> Show BasicError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BasicError -> ShowS
showsPrec :: Int -> BasicError -> ShowS
$cshow :: BasicError -> String
show :: BasicError -> String
$cshowList :: [BasicError] -> ShowS
showList :: [BasicError] -> ShowS
Show)

-- | Extended error info
-- available for protoVersion_minor >= 26
data ErrorInfo = ErrorInfo
  { ErrorInfo -> Verbosity
errorInfoLevel :: Verbosity
  , ErrorInfo -> Text
errorInfoMessage :: Text
  , ErrorInfo -> Maybe Int
errorInfoPosition :: Maybe Int -- Error position, Nix always writes 0 here
  , ErrorInfo -> [Trace]
errorInfoTraces :: [Trace]
  }
  deriving (ErrorInfo -> ErrorInfo -> Bool
(ErrorInfo -> ErrorInfo -> Bool)
-> (ErrorInfo -> ErrorInfo -> Bool) -> Eq ErrorInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ErrorInfo -> ErrorInfo -> Bool
== :: ErrorInfo -> ErrorInfo -> Bool
$c/= :: ErrorInfo -> ErrorInfo -> Bool
/= :: ErrorInfo -> ErrorInfo -> Bool
Eq, (forall x. ErrorInfo -> Rep ErrorInfo x)
-> (forall x. Rep ErrorInfo x -> ErrorInfo) -> Generic ErrorInfo
forall x. Rep ErrorInfo x -> ErrorInfo
forall x. ErrorInfo -> Rep ErrorInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ErrorInfo -> Rep ErrorInfo x
from :: forall x. ErrorInfo -> Rep ErrorInfo x
$cto :: forall x. Rep ErrorInfo x -> ErrorInfo
to :: forall x. Rep ErrorInfo x -> ErrorInfo
Generic, Eq ErrorInfo
Eq ErrorInfo =>
(ErrorInfo -> ErrorInfo -> Ordering)
-> (ErrorInfo -> ErrorInfo -> Bool)
-> (ErrorInfo -> ErrorInfo -> Bool)
-> (ErrorInfo -> ErrorInfo -> Bool)
-> (ErrorInfo -> ErrorInfo -> Bool)
-> (ErrorInfo -> ErrorInfo -> ErrorInfo)
-> (ErrorInfo -> ErrorInfo -> ErrorInfo)
-> Ord ErrorInfo
ErrorInfo -> ErrorInfo -> Bool
ErrorInfo -> ErrorInfo -> Ordering
ErrorInfo -> ErrorInfo -> ErrorInfo
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ErrorInfo -> ErrorInfo -> Ordering
compare :: ErrorInfo -> ErrorInfo -> Ordering
$c< :: ErrorInfo -> ErrorInfo -> Bool
< :: ErrorInfo -> ErrorInfo -> Bool
$c<= :: ErrorInfo -> ErrorInfo -> Bool
<= :: ErrorInfo -> ErrorInfo -> Bool
$c> :: ErrorInfo -> ErrorInfo -> Bool
> :: ErrorInfo -> ErrorInfo -> Bool
$c>= :: ErrorInfo -> ErrorInfo -> Bool
>= :: ErrorInfo -> ErrorInfo -> Bool
$cmax :: ErrorInfo -> ErrorInfo -> ErrorInfo
max :: ErrorInfo -> ErrorInfo -> ErrorInfo
$cmin :: ErrorInfo -> ErrorInfo -> ErrorInfo
min :: ErrorInfo -> ErrorInfo -> ErrorInfo
Ord, Int -> ErrorInfo -> ShowS
[ErrorInfo] -> ShowS
ErrorInfo -> String
(Int -> ErrorInfo -> ShowS)
-> (ErrorInfo -> String)
-> ([ErrorInfo] -> ShowS)
-> Show ErrorInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ErrorInfo -> ShowS
showsPrec :: Int -> ErrorInfo -> ShowS
$cshow :: ErrorInfo -> String
show :: ErrorInfo -> String
$cshowList :: [ErrorInfo] -> ShowS
showList :: [ErrorInfo] -> ShowS
Show)

data LoggerOpCode
  = LoggerOpCode_Next
  | LoggerOpCode_Read
  | LoggerOpCode_Write
  | LoggerOpCode_Last
  | LoggerOpCode_Error
  | LoggerOpCode_StartActivity
  | LoggerOpCode_StopActivity
  | LoggerOpCode_Result
  deriving (LoggerOpCode -> LoggerOpCode -> Bool
(LoggerOpCode -> LoggerOpCode -> Bool)
-> (LoggerOpCode -> LoggerOpCode -> Bool) -> Eq LoggerOpCode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LoggerOpCode -> LoggerOpCode -> Bool
== :: LoggerOpCode -> LoggerOpCode -> Bool
$c/= :: LoggerOpCode -> LoggerOpCode -> Bool
/= :: LoggerOpCode -> LoggerOpCode -> Bool
Eq, (forall x. LoggerOpCode -> Rep LoggerOpCode x)
-> (forall x. Rep LoggerOpCode x -> LoggerOpCode)
-> Generic LoggerOpCode
forall x. Rep LoggerOpCode x -> LoggerOpCode
forall x. LoggerOpCode -> Rep LoggerOpCode x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. LoggerOpCode -> Rep LoggerOpCode x
from :: forall x. LoggerOpCode -> Rep LoggerOpCode x
$cto :: forall x. Rep LoggerOpCode x -> LoggerOpCode
to :: forall x. Rep LoggerOpCode x -> LoggerOpCode
Generic, Eq LoggerOpCode
Eq LoggerOpCode =>
(LoggerOpCode -> LoggerOpCode -> Ordering)
-> (LoggerOpCode -> LoggerOpCode -> Bool)
-> (LoggerOpCode -> LoggerOpCode -> Bool)
-> (LoggerOpCode -> LoggerOpCode -> Bool)
-> (LoggerOpCode -> LoggerOpCode -> Bool)
-> (LoggerOpCode -> LoggerOpCode -> LoggerOpCode)
-> (LoggerOpCode -> LoggerOpCode -> LoggerOpCode)
-> Ord LoggerOpCode
LoggerOpCode -> LoggerOpCode -> Bool
LoggerOpCode -> LoggerOpCode -> Ordering
LoggerOpCode -> LoggerOpCode -> LoggerOpCode
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: LoggerOpCode -> LoggerOpCode -> Ordering
compare :: LoggerOpCode -> LoggerOpCode -> Ordering
$c< :: LoggerOpCode -> LoggerOpCode -> Bool
< :: LoggerOpCode -> LoggerOpCode -> Bool
$c<= :: LoggerOpCode -> LoggerOpCode -> Bool
<= :: LoggerOpCode -> LoggerOpCode -> Bool
$c> :: LoggerOpCode -> LoggerOpCode -> Bool
> :: LoggerOpCode -> LoggerOpCode -> Bool
$c>= :: LoggerOpCode -> LoggerOpCode -> Bool
>= :: LoggerOpCode -> LoggerOpCode -> Bool
$cmax :: LoggerOpCode -> LoggerOpCode -> LoggerOpCode
max :: LoggerOpCode -> LoggerOpCode -> LoggerOpCode
$cmin :: LoggerOpCode -> LoggerOpCode -> LoggerOpCode
min :: LoggerOpCode -> LoggerOpCode -> LoggerOpCode
Ord, Int -> LoggerOpCode -> ShowS
[LoggerOpCode] -> ShowS
LoggerOpCode -> String
(Int -> LoggerOpCode -> ShowS)
-> (LoggerOpCode -> String)
-> ([LoggerOpCode] -> ShowS)
-> Show LoggerOpCode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LoggerOpCode -> ShowS
showsPrec :: Int -> LoggerOpCode -> ShowS
$cshow :: LoggerOpCode -> String
show :: LoggerOpCode -> String
$cshowList :: [LoggerOpCode] -> ShowS
showList :: [LoggerOpCode] -> ShowS
Show)

loggerOpCodeToWord64 :: LoggerOpCode -> Word64
loggerOpCodeToWord64 :: LoggerOpCode -> Word64
loggerOpCodeToWord64 = \case
  LoggerOpCode
LoggerOpCode_Next -> Word64
0x6f6c6d67
  LoggerOpCode
LoggerOpCode_Read -> Word64
0x64617461
  LoggerOpCode
LoggerOpCode_Write -> Word64
0x64617416
  LoggerOpCode
LoggerOpCode_Last -> Word64
0x616c7473
  LoggerOpCode
LoggerOpCode_Error -> Word64
0x63787470
  LoggerOpCode
LoggerOpCode_StartActivity -> Word64
0x53545254
  LoggerOpCode
LoggerOpCode_StopActivity -> Word64
0x53544f50
  LoggerOpCode
LoggerOpCode_Result -> Word64
0x52534c54

word64ToLoggerOpCode :: Word64 -> Either String LoggerOpCode
word64ToLoggerOpCode :: Word64 -> Either String LoggerOpCode
word64ToLoggerOpCode = \case
  Word64
0x6f6c6d67 -> LoggerOpCode -> Either String LoggerOpCode
forall a b. b -> Either a b
Right LoggerOpCode
LoggerOpCode_Next
  Word64
0x64617461 -> LoggerOpCode -> Either String LoggerOpCode
forall a b. b -> Either a b
Right LoggerOpCode
LoggerOpCode_Read
  Word64
0x64617416 -> LoggerOpCode -> Either String LoggerOpCode
forall a b. b -> Either a b
Right LoggerOpCode
LoggerOpCode_Write
  Word64
0x616c7473 -> LoggerOpCode -> Either String LoggerOpCode
forall a b. b -> Either a b
Right LoggerOpCode
LoggerOpCode_Last
  Word64
0x63787470 -> LoggerOpCode -> Either String LoggerOpCode
forall a b. b -> Either a b
Right LoggerOpCode
LoggerOpCode_Error
  Word64
0x53545254 -> LoggerOpCode -> Either String LoggerOpCode
forall a b. b -> Either a b
Right LoggerOpCode
LoggerOpCode_StartActivity
  Word64
0x53544f50 -> LoggerOpCode -> Either String LoggerOpCode
forall a b. b -> Either a b
Right LoggerOpCode
LoggerOpCode_StopActivity
  Word64
0x52534c54 -> LoggerOpCode -> Either String LoggerOpCode
forall a b. b -> Either a b
Right LoggerOpCode
LoggerOpCode_Result
  Word64
x -> String -> Either String LoggerOpCode
forall a b. a -> Either a b
Left (String -> Either String LoggerOpCode)
-> String -> Either String LoggerOpCode
forall a b. (a -> b) -> a -> b
$ String
"Invalid LoggerOpCode: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Word64 -> String
forall a. Show a => a -> String
show Word64
x

data Logger
  = Logger_Next Text
  | Logger_Read Word64      -- data needed from source
  | Logger_Write ByteString -- data for sink
  | Logger_Last
  | Logger_Error (Either BasicError ErrorInfo)
  | Logger_StartActivity
      { Logger -> ActivityID
startActivityID :: ActivityID
      , Logger -> Verbosity
startActivityVerbosity :: Verbosity
      , Logger -> Maybe Activity
startActivityType :: Maybe Activity
      , Logger -> ByteString
startActivityString :: ByteString
      , Logger -> [Field]
startActivityFields :: [Field]
      , Logger -> ActivityID
startActivityParentID :: ActivityID
      }
  | Logger_StopActivity
      { Logger -> ActivityID
stopActivityID :: ActivityID
      }
  | Logger_Result
      { Logger -> ActivityID
resultActivityID :: ActivityID
      , Logger -> ActivityResult
resultType :: ActivityResult
      , Logger -> [Field]
resultFields :: [Field]
      }
  deriving (Logger -> Logger -> Bool
(Logger -> Logger -> Bool)
-> (Logger -> Logger -> Bool) -> Eq Logger
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Logger -> Logger -> Bool
== :: Logger -> Logger -> Bool
$c/= :: Logger -> Logger -> Bool
/= :: Logger -> Logger -> Bool
Eq, (forall x. Logger -> Rep Logger x)
-> (forall x. Rep Logger x -> Logger) -> Generic Logger
forall x. Rep Logger x -> Logger
forall x. Logger -> Rep Logger x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Logger -> Rep Logger x
from :: forall x. Logger -> Rep Logger x
$cto :: forall x. Rep Logger x -> Logger
to :: forall x. Rep Logger x -> Logger
Generic, Eq Logger
Eq Logger =>
(Logger -> Logger -> Ordering)
-> (Logger -> Logger -> Bool)
-> (Logger -> Logger -> Bool)
-> (Logger -> Logger -> Bool)
-> (Logger -> Logger -> Bool)
-> (Logger -> Logger -> Logger)
-> (Logger -> Logger -> Logger)
-> Ord Logger
Logger -> Logger -> Bool
Logger -> Logger -> Ordering
Logger -> Logger -> Logger
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Logger -> Logger -> Ordering
compare :: Logger -> Logger -> Ordering
$c< :: Logger -> Logger -> Bool
< :: Logger -> Logger -> Bool
$c<= :: Logger -> Logger -> Bool
<= :: Logger -> Logger -> Bool
$c> :: Logger -> Logger -> Bool
> :: Logger -> Logger -> Bool
$c>= :: Logger -> Logger -> Bool
>= :: Logger -> Logger -> Bool
$cmax :: Logger -> Logger -> Logger
max :: Logger -> Logger -> Logger
$cmin :: Logger -> Logger -> Logger
min :: Logger -> Logger -> Logger
Ord, Int -> Logger -> ShowS
[Logger] -> ShowS
Logger -> String
(Int -> Logger -> ShowS)
-> (Logger -> String) -> ([Logger] -> ShowS) -> Show Logger
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Logger -> ShowS
showsPrec :: Int -> Logger -> ShowS
$cshow :: Logger -> String
show :: Logger -> String
$cshowList :: [Logger] -> ShowS
showList :: [Logger] -> ShowS
Show)

isError :: Logger -> Bool
isError :: Logger -> Bool
isError Logger_Error {} = Bool
True
isError Logger
_ = Bool
False