{-# LANGUAGE TemplateHaskell #-}

-- | the @fused-effects@ + @Json@ frontend
module Control.Effect.Unclog.Json
  ( -- * logging functions for different log levels
    debug
  , info
  , warn
  , fatal

    -- * helpers
  , logJson
  )
where

import Control.Effect.Unclog (publishLogEntry)
import Data.Aeson
import Data.ByteString qualified as BS
import Language.Haskell.TH.Syntax (Exp, Q, unTypeCode)
import Unclog.Common (LogLevel (..))
import Unclog.Frontend (mkLogEntry)

logJson :: LogLevel -> Q Exp
logJson :: LogLevel -> Q Exp
logJson LogLevel
lvl =
  [|
    \obj -> do
      let entry ts = $(Code Q (Time -> StrictByteString -> LogEntry) -> Q Exp
forall a (m :: * -> *). Quote m => Code m a -> m Exp
unTypeCode (Code Q (Time -> StrictByteString -> LogEntry) -> Q Exp)
-> Code Q (Time -> StrictByteString -> LogEntry) -> Q Exp
forall a b. (a -> b) -> a -> b
$ LogLevel -> Code Q (Time -> StrictByteString -> LogEntry)
forall (q :: * -> *).
(Quote q, Quasi q) =>
LogLevel -> Code q (Time -> StrictByteString -> LogEntry)
mkLogEntry LogLevel
lvl) ts (BS.toStrict . encode $ Object obj)
      publishLogEntry entry
    |]

debug :: Q Exp
debug :: Q Exp
debug = LogLevel -> Q Exp
logJson LogLevel
Debug

info :: Q Exp
info :: Q Exp
info = LogLevel -> Q Exp
logJson LogLevel
Info

warn :: Q Exp
warn :: Q Exp
warn = LogLevel -> Q Exp
logJson LogLevel
Warn

fatal :: Q Exp
fatal :: Q Exp
fatal = LogLevel -> Q Exp
logJson LogLevel
Fatal