{-# LANGUAGE OverloadedStrings    #-}
{- |
   Module      : Text.Pandoc.Lua.Marshal.LogMessage
   Copyright   : © 2017-2024 Albert Krewinkel
   License     : GPL-2.0-or-later
   Maintainer  : Albert Krewinkel <albert+pandoc@tarleb.com>

Pushing and retrieving of pandoc log messages.
-}
module Text.Pandoc.Lua.Marshal.LogMessage
  ( peekLogMessage
  , pushLogMessage
  , typeLogMessage
  ) where

import HsLua
import Text.Pandoc.Logging (LogMessage, showLogMessage)
import qualified Data.Aeson as Aeson

-- | Type definition for pandoc log messages.
typeLogMessage :: LuaError e => DocumentedType e LogMessage
typeLogMessage :: forall e. LuaError e => DocumentedType e LogMessage
typeLogMessage = Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) LogMessage]
-> DocumentedType e LogMessage
forall e a.
LuaError e =>
Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) a]
-> DocumentedType e a
deftype Name
"LogMessage"
  [ Operation
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
forall e.
Operation
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
operation Operation
Index (DocumentedFunction e -> (Operation, DocumentedFunction e))
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
forall a b. (a -> b) -> a -> b
$ Name
-> (LogMessage -> LuaE e Text)
-> HsFnPrecursor e (LogMessage -> LuaE e Text)
forall a e. Name -> a -> HsFnPrecursor e a
defun Name
"__tostring"
      ### liftPure showLogMessage
      HsFnPrecursor e (LogMessage -> LuaE e Text)
-> Parameter e LogMessage -> HsFnPrecursor e (LuaE e Text)
forall e a b.
HsFnPrecursor e (a -> b) -> Parameter e a -> HsFnPrecursor e b
<#> DocumentedType e LogMessage
-> Text -> Text -> Parameter e LogMessage
forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype
-> Text -> Text -> Parameter e a
udparam DocumentedType e LogMessage
forall e. LuaError e => DocumentedType e LogMessage
typeLogMessage Text
"msg" Text
"object"
      HsFnPrecursor e (LuaE e Text)
-> FunctionResults e Text -> DocumentedFunction e
forall e a.
HsFnPrecursor e (LuaE e a)
-> FunctionResults e a -> DocumentedFunction e
=#> Pusher e Text -> TypeSpec -> Text -> FunctionResults e Text
forall e a. Pusher e a -> TypeSpec -> Text -> FunctionResults e a
functionResult Pusher e Text
forall e. Pusher e Text
pushText TypeSpec
"string" Text
"stringified log message"
  , Operation
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
forall e.
Operation
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
operation (Name -> Operation
CustomOperation Name
"__tojson") (DocumentedFunction e -> (Operation, DocumentedFunction e))
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
forall a b. (a -> b) -> a -> b
$ (LogMessage -> LuaE e ByteString)
-> HsFnPrecursor e (LogMessage -> LuaE e ByteString)
forall a e. a -> HsFnPrecursor e a
lambda
      ### liftPure Aeson.encode
      HsFnPrecursor e (LogMessage -> LuaE e ByteString)
-> Parameter e LogMessage -> HsFnPrecursor e (LuaE e ByteString)
forall e a b.
HsFnPrecursor e (a -> b) -> Parameter e a -> HsFnPrecursor e b
<#> DocumentedType e LogMessage
-> Text -> Text -> Parameter e LogMessage
forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype
-> Text -> Text -> Parameter e a
udparam DocumentedType e LogMessage
forall e. LuaError e => DocumentedType e LogMessage
typeLogMessage Text
"msg" Text
"object"
      HsFnPrecursor e (LuaE e ByteString)
-> FunctionResults e ByteString -> DocumentedFunction e
forall e a.
HsFnPrecursor e (LuaE e a)
-> FunctionResults e a -> DocumentedFunction e
=#> Pusher e ByteString
-> TypeSpec -> Text -> FunctionResults e ByteString
forall e a. Pusher e a -> TypeSpec -> Text -> FunctionResults e a
functionResult Pusher e ByteString
forall e. Pusher e ByteString
pushLazyByteString TypeSpec
"string" Text
"JSON encoded object"
  ]
  [Member e (DocumentedFunction e) LogMessage]
forall a. Monoid a => a
mempty -- no members

-- | Pushes a LogMessage to the stack.
pushLogMessage :: LuaError e => Pusher e LogMessage
pushLogMessage :: forall e. LuaError e => Pusher e LogMessage
pushLogMessage = DocumentedTypeWithList e LogMessage (ZonkAny 2)
-> LogMessage -> LuaE e ()
forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> a -> LuaE e ()
pushUD DocumentedTypeWithList e LogMessage (ZonkAny 2)
forall e. LuaError e => DocumentedType e LogMessage
typeLogMessage

peekLogMessage :: LuaError e => Peeker e LogMessage
peekLogMessage :: forall e. LuaError e => Peeker e LogMessage
peekLogMessage  = DocumentedTypeWithList e LogMessage (ZonkAny 3)
-> Peeker e LogMessage
forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype -> Peeker e a
peekUD DocumentedTypeWithList e LogMessage (ZonkAny 3)
forall e. LuaError e => DocumentedType e LogMessage
typeLogMessage