diff options
author | Albert Krewinkel <albert@zeitkraut.de> | 2021-10-20 21:40:07 +0200 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2021-10-22 11:16:51 -0700 |
commit | e4287e6c950745ad78954b791bc87f322cd05530 (patch) | |
tree | 967cf9866536e96b1656842e6b0792c01e2bc12f /src/Text/Pandoc/Lua/Marshaling | |
parent | 9e74826ba9ce4139bfdd3f057a79efa8b644e85a (diff) | |
download | pandoc-e4287e6c950745ad78954b791bc87f322cd05530.tar.gz |
Lua: marshal Pandoc values as userdata
Diffstat (limited to 'src/Text/Pandoc/Lua/Marshaling')
-rw-r--r-- | src/Text/Pandoc/Lua/Marshaling/AST.hs | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/src/Text/Pandoc/Lua/Marshaling/AST.hs b/src/Text/Pandoc/Lua/Marshaling/AST.hs index eedf00a94..6f97bdd36 100644 --- a/src/Text/Pandoc/Lua/Marshaling/AST.hs +++ b/src/Text/Pandoc/Lua/Marshaling/AST.hs @@ -40,7 +40,7 @@ import Control.Monad ((<$!>), (>=>)) import HsLua hiding (Operation (Div)) import Text.Pandoc.Definition import Text.Pandoc.Lua.Util (pushViaConstr', pushViaConstructor) -import Text.Pandoc.Lua.Marshaling.CommonState () +import Text.Pandoc.Lua.Marshaling.List (pushPandocList) import qualified HsLua as Lua import qualified Text.Pandoc.Lua.Util as LuaUtil @@ -49,19 +49,32 @@ instance Pushable Pandoc where push = pushPandoc pushPandoc :: LuaError e => Pusher e Pandoc -pushPandoc (Pandoc meta blocks) = - pushViaConstr' "Pandoc" [pushList pushBlock blocks, push meta] +pushPandoc = pushUD typePandoc peekPandoc :: LuaError e => Peeker e Pandoc -peekPandoc = fmap (retrieving "Pandoc value") - . typeChecked "table" Lua.istable $ \idx -> do - meta <- peekFieldRaw peekMeta "meta" idx - blks <- peekFieldRaw peekBlocks "blocks" idx - return $ Pandoc meta blks +peekPandoc = retrieving "Pandoc value" . peekUD typePandoc + +typePandoc :: LuaError e => DocumentedType e Pandoc +typePandoc = deftype "Pandoc" + [ operation Eq $ defun "__eq" + ### liftPure2 (==) + <#> parameter (optional . peekPandoc) "doc1" "pandoc" "" + <#> parameter (optional . peekPandoc) "doc2" "pandoc" "" + =#> functionResult pushBool "boolean" "true iff the two values are equal" + ] + [ property "blocks" "list of blocks" + (pushPandocList pushBlock, \(Pandoc _ blks) -> blks) + (peekList peekBlock, \(Pandoc m _) blks -> Pandoc m blks) + , property "meta" "document metadata" + (pushMeta, \(Pandoc meta _) -> meta) + (peekMeta, \(Pandoc _ blks) meta -> Pandoc meta blks) + ] instance Pushable Meta where - push (Meta mmap) = - pushViaConstr' "Meta" [push mmap] + push = pushMeta + +pushMeta :: LuaError e => Pusher e Meta +pushMeta (Meta mmap) = pushViaConstr' "Meta" [push mmap] peekMeta :: LuaError e => Peeker e Meta peekMeta idx = retrieving "Meta" $ |