blob: f6d9d6e43d8582c2865072557d1131c2df9339ea (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{- |
Module : Text.Pandoc.Lua.Marshal.PandocError
Copyright : © 2020-2023 Albert Krewinkel
License : GNU GPL, version 2 or above
Maintainer : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
Stability : alpha
Marshal of @'PandocError'@ values.
-}
module Text.Pandoc.Lua.Marshal.PandocError
( peekPandocError
, pushPandocError
, typePandocError
)
where
import HsLua (LuaError, Peeker, Pusher, liftLua, pushText)
import HsLua.Packaging
import Text.Pandoc.Error (PandocError (PandocLuaError), renderError)
import qualified HsLua as Lua
import qualified HsLua.Core.Utf8 as UTF8
-- | Lua userdata type definition for PandocError.
typePandocError :: LuaError e => DocumentedType e PandocError
typePandocError = deftype "PandocError"
[ operation Tostring $ defun "__tostring"
### liftPure (\case
PandocLuaError e -> e
err -> renderError err)
<#> udparam typePandocError "obj" "PandocError object"
=#> functionResult pushText "string" "string representation of error."
]
mempty -- no members
-- | Peek a @'PandocError'@ element to the Lua stack.
pushPandocError :: LuaError e => Pusher e PandocError
pushPandocError = pushUD typePandocError
-- | Retrieve a @'PandocError'@ from the Lua stack.
peekPandocError :: LuaError e => Peeker e PandocError
peekPandocError idx = Lua.retrieving "PandocError" $
liftLua (Lua.ltype idx) >>= \case
Lua.TypeUserdata -> peekUD typePandocError idx
_ -> do
msg <- liftLua $ do
Lua.pushvalue idx
Lua.state >>= \l -> Lua.liftIO (Lua.popErrorMessage l)
return $ PandocLuaError (UTF8.toText msg)
|