{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE OverloadedRecordDot #-}
module Debug.TraceEmbrace.Config.Type.TraceMessage where

import Control.Applicative
import Control.Lens hiding (levels)
import Data.Aeson hiding (Error)
import Data.Generics.Labels ()
import Debug.TraceEmbrace.Config.Validation
import GHC.Generics
import Language.Haskell.TH.Syntax
import Refined

data TraceMessageElement
  = LiteralMessage -- ^ Constant tracing message
  | Variables -- ^ Variables e.g. @; x: 123; y: 321@
  | FullyQualifiedModule -- ^ Full Haskell module name (e.g. @Data.Map.Strict@)
  | ModuleName -- ^ Unqualified Haskell module name (e.g. @Strict@)
  | ShortenJavaModule -- ^ @D.M.Strict@
  | PackageName -- ^ Cabal package name
  | FunctionName -- ^ Function or method name containing tracing
  | LineNumber -- ^ Line number with tracing
  | Delimiter String -- | TraceMessageElement delimiter
  deriving (TraceMessageElement -> TraceMessageElement -> Bool
(TraceMessageElement -> TraceMessageElement -> Bool)
-> (TraceMessageElement -> TraceMessageElement -> Bool)
-> Eq TraceMessageElement
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TraceMessageElement -> TraceMessageElement -> Bool
== :: TraceMessageElement -> TraceMessageElement -> Bool
$c/= :: TraceMessageElement -> TraceMessageElement -> Bool
/= :: TraceMessageElement -> TraceMessageElement -> Bool
Eq, Int -> TraceMessageElement -> ShowS
[TraceMessageElement] -> ShowS
TraceMessageElement -> String
(Int -> TraceMessageElement -> ShowS)
-> (TraceMessageElement -> String)
-> ([TraceMessageElement] -> ShowS)
-> Show TraceMessageElement
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TraceMessageElement -> ShowS
showsPrec :: Int -> TraceMessageElement -> ShowS
$cshow :: TraceMessageElement -> String
show :: TraceMessageElement -> String
$cshowList :: [TraceMessageElement] -> ShowS
showList :: [TraceMessageElement] -> ShowS
Show, (forall x. TraceMessageElement -> Rep TraceMessageElement x)
-> (forall x. Rep TraceMessageElement x -> TraceMessageElement)
-> Generic TraceMessageElement
forall x. Rep TraceMessageElement x -> TraceMessageElement
forall x. TraceMessageElement -> Rep TraceMessageElement x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TraceMessageElement -> Rep TraceMessageElement x
from :: forall x. TraceMessageElement -> Rep TraceMessageElement x
$cto :: forall x. Rep TraceMessageElement x -> TraceMessageElement
to :: forall x. Rep TraceMessageElement x -> TraceMessageElement
Generic, (forall (m :: * -> *). Quote m => TraceMessageElement -> m Exp)
-> (forall (m :: * -> *).
    Quote m =>
    TraceMessageElement -> Code m TraceMessageElement)
-> Lift TraceMessageElement
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => TraceMessageElement -> m Exp
forall (m :: * -> *).
Quote m =>
TraceMessageElement -> Code m TraceMessageElement
$clift :: forall (m :: * -> *). Quote m => TraceMessageElement -> m Exp
lift :: forall (m :: * -> *). Quote m => TraceMessageElement -> m Exp
$cliftTyped :: forall (m :: * -> *).
Quote m =>
TraceMessageElement -> Code m TraceMessageElement
liftTyped :: forall (m :: * -> *).
Quote m =>
TraceMessageElement -> Code m TraceMessageElement
Lift)

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

data TraceMessageFormatG a
  = TraceMessageFormat
    { forall (a :: * -> *).
TraceMessageFormatG a -> Columnar a SeparatorValidator String
entrySeparator :: Columnar a SeparatorValidator String -- ^ @"; "@ is default
    , forall (a :: * -> *).
TraceMessageFormatG a -> Columnar a SeparatorValidator String
keyValueSeparator :: Columnar a SeparatorValidator String -- ^ @": "@ is default
    , forall (a :: * -> *).
TraceMessageFormatG a -> Columnar a SeparatorValidator String
retValPrefix :: Columnar a SeparatorValidator String -- ^ @" => "@
    , forall (a :: * -> *).
TraceMessageFormatG a -> Columnar a NonEmpty [TraceMessageElement]
traceLinePattern :: Columnar a NonEmpty [TraceMessageElement]
    }

-- watch out for derivation order: https://gitlab.haskell.org/ghc/ghc/-/issues/25798
entrySeparator :: Lens' (TraceMessageFormatG a) (Columnar a SeparatorValidator String)
entrySeparator :: forall (a :: * -> *) (f :: * -> *).
Functor f =>
(Columnar a SeparatorValidator String
 -> f (Columnar a SeparatorValidator String))
-> TraceMessageFormatG a -> f (TraceMessageFormatG a)
entrySeparator = (TraceMessageFormatG a -> Columnar a SeparatorValidator String)
-> (TraceMessageFormatG a
    -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
-> Lens
     (TraceMessageFormatG a)
     (TraceMessageFormatG a)
     (Columnar a SeparatorValidator String)
     (Columnar a SeparatorValidator String)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (.entrySeparator) ((TraceMessageFormatG a
  -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
 -> Lens
      (TraceMessageFormatG a)
      (TraceMessageFormatG a)
      (Columnar a SeparatorValidator String)
      (Columnar a SeparatorValidator String))
-> (TraceMessageFormatG a
    -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
-> Lens
     (TraceMessageFormatG a)
     (TraceMessageFormatG a)
     (Columnar a SeparatorValidator String)
     (Columnar a SeparatorValidator String)
forall a b. (a -> b) -> a -> b
$ \TraceMessageFormatG a
x Columnar a SeparatorValidator String
a -> TraceMessageFormatG a
x { entrySeparator = a }
keyValueSeparator :: Lens' (TraceMessageFormatG a) (Columnar a SeparatorValidator String)
keyValueSeparator :: forall (a :: * -> *) (f :: * -> *).
Functor f =>
(Columnar a SeparatorValidator String
 -> f (Columnar a SeparatorValidator String))
-> TraceMessageFormatG a -> f (TraceMessageFormatG a)
keyValueSeparator = (TraceMessageFormatG a -> Columnar a SeparatorValidator String)
-> (TraceMessageFormatG a
    -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
-> Lens
     (TraceMessageFormatG a)
     (TraceMessageFormatG a)
     (Columnar a SeparatorValidator String)
     (Columnar a SeparatorValidator String)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (.keyValueSeparator) ((TraceMessageFormatG a
  -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
 -> Lens
      (TraceMessageFormatG a)
      (TraceMessageFormatG a)
      (Columnar a SeparatorValidator String)
      (Columnar a SeparatorValidator String))
-> (TraceMessageFormatG a
    -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
-> Lens
     (TraceMessageFormatG a)
     (TraceMessageFormatG a)
     (Columnar a SeparatorValidator String)
     (Columnar a SeparatorValidator String)
forall a b. (a -> b) -> a -> b
$ \TraceMessageFormatG a
x Columnar a SeparatorValidator String
a -> TraceMessageFormatG a
x { keyValueSeparator = a }
retValPrefix :: Lens' (TraceMessageFormatG a) (Columnar a SeparatorValidator String)
retValPrefix :: forall (a :: * -> *) (f :: * -> *).
Functor f =>
(Columnar a SeparatorValidator String
 -> f (Columnar a SeparatorValidator String))
-> TraceMessageFormatG a -> f (TraceMessageFormatG a)
retValPrefix = (TraceMessageFormatG a -> Columnar a SeparatorValidator String)
-> (TraceMessageFormatG a
    -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
-> Lens
     (TraceMessageFormatG a)
     (TraceMessageFormatG a)
     (Columnar a SeparatorValidator String)
     (Columnar a SeparatorValidator String)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (.retValPrefix) ((TraceMessageFormatG a
  -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
 -> Lens
      (TraceMessageFormatG a)
      (TraceMessageFormatG a)
      (Columnar a SeparatorValidator String)
      (Columnar a SeparatorValidator String))
-> (TraceMessageFormatG a
    -> Columnar a SeparatorValidator String -> TraceMessageFormatG a)
-> Lens
     (TraceMessageFormatG a)
     (TraceMessageFormatG a)
     (Columnar a SeparatorValidator String)
     (Columnar a SeparatorValidator String)
forall a b. (a -> b) -> a -> b
$ \TraceMessageFormatG a
x Columnar a SeparatorValidator String
a -> TraceMessageFormatG a
x { retValPrefix = a }
traceLinePattern :: Lens' (TraceMessageFormatG a) (Columnar a NonEmpty [TraceMessageElement])
traceLinePattern :: forall (a :: * -> *) (f :: * -> *).
Functor f =>
(Columnar a NonEmpty [TraceMessageElement]
 -> f (Columnar a NonEmpty [TraceMessageElement]))
-> TraceMessageFormatG a -> f (TraceMessageFormatG a)
traceLinePattern = (TraceMessageFormatG a
 -> Columnar a NonEmpty [TraceMessageElement])
-> (TraceMessageFormatG a
    -> Columnar a NonEmpty [TraceMessageElement]
    -> TraceMessageFormatG a)
-> Lens
     (TraceMessageFormatG a)
     (TraceMessageFormatG a)
     (Columnar a NonEmpty [TraceMessageElement])
     (Columnar a NonEmpty [TraceMessageElement])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (.traceLinePattern) ((TraceMessageFormatG a
  -> Columnar a NonEmpty [TraceMessageElement]
  -> TraceMessageFormatG a)
 -> Lens
      (TraceMessageFormatG a)
      (TraceMessageFormatG a)
      (Columnar a NonEmpty [TraceMessageElement])
      (Columnar a NonEmpty [TraceMessageElement]))
-> (TraceMessageFormatG a
    -> Columnar a NonEmpty [TraceMessageElement]
    -> TraceMessageFormatG a)
-> Lens
     (TraceMessageFormatG a)
     (TraceMessageFormatG a)
     (Columnar a NonEmpty [TraceMessageElement])
     (Columnar a NonEmpty [TraceMessageElement])
forall a b. (a -> b) -> a -> b
$ \TraceMessageFormatG a
x Columnar a NonEmpty [TraceMessageElement]
a -> TraceMessageFormatG a
x { traceLinePattern = a }

type TraceMessageFormat = TraceMessageFormatG Identity
type TraceMessageFormatMaybe = TraceMessageFormatG Maybe


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

instance ToJSON TraceMessageFormatMaybe where
  toEncoding :: TraceMessageFormatMaybe -> Encoding
toEncoding = Options -> TraceMessageFormatMaybe -> Encoding
forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
defaultOptions
instance FromJSON TraceMessageFormatMaybe
instance Semigroup TraceMessageFormatMaybe where
  TraceMessageFormatMaybe
a <> :: TraceMessageFormatMaybe
-> TraceMessageFormatMaybe -> TraceMessageFormatMaybe
<> TraceMessageFormatMaybe
b =
    Columnar Maybe SeparatorValidator String
-> Columnar Maybe SeparatorValidator String
-> Columnar Maybe SeparatorValidator String
-> Columnar Maybe NonEmpty [TraceMessageElement]
-> TraceMessageFormatMaybe
forall (a :: * -> *).
Columnar a SeparatorValidator String
-> Columnar a SeparatorValidator String
-> Columnar a SeparatorValidator String
-> Columnar a NonEmpty [TraceMessageElement]
-> TraceMessageFormatG a
TraceMessageFormat
    (TraceMessageFormatMaybe
a.entrySeparator Maybe String -> Maybe String -> Maybe String
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TraceMessageFormatMaybe
b.entrySeparator)
    (TraceMessageFormatMaybe
a.keyValueSeparator Maybe String -> Maybe String -> Maybe String
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TraceMessageFormatMaybe
b.keyValueSeparator)
    (TraceMessageFormatMaybe
a.retValPrefix Maybe String -> Maybe String -> Maybe String
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TraceMessageFormatMaybe
b.retValPrefix)
    (TraceMessageFormatMaybe
a.traceLinePattern Maybe [TraceMessageElement]
-> Maybe [TraceMessageElement] -> Maybe [TraceMessageElement]
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TraceMessageFormatMaybe
b.traceLinePattern)