aboutsummaryrefslogtreecommitdiff
path: root/pandoc-lua-engine
diff options
context:
space:
mode:
authorAlbert Krewinkel <[email protected]>2026-01-05 22:46:32 +0100
committerAlbert Krewinkel <[email protected]>2026-01-05 22:48:45 +0100
commite9c4d7f7246d0312e7b7613c8aa1b15c4559826f (patch)
treefcf279014d55b36fce6e796ce79e9e776060886b /pandoc-lua-engine
parent2a426718bc7c6cc88ceac0359b60f840d0f27bf9 (diff)
Lua: let `pandoc.with_state` error on unknown options
Unknown or unsupported options now cause the `pandoc.with_state` function to fail. Closes: #11376
Diffstat (limited to 'pandoc-lua-engine')
-rw-r--r--pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Pandoc.hs38
-rw-r--r--pandoc-lua-engine/test/lua/module/pandoc.lua13
2 files changed, 32 insertions, 19 deletions
diff --git a/pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Pandoc.hs b/pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Pandoc.hs
index 56cb52910..9e6d033d4 100644
--- a/pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Pandoc.hs
+++ b/pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Pandoc.hs
@@ -485,21 +485,29 @@ data StateOptions = StateOptions
-- unspecified values.
peekStateOptions :: Peeker PandocError StateOptions
peekStateOptions idx = do
- opts <- liftLua getStateOptions
- let peekStateField field defVal peeker =
- peekFieldRaw (fmap (fromMaybe defVal) . peekNilOr peeker) field idx
- let peekOptStateField field defVal peeker =
- peekFieldRaw (fmap (maybe defVal Just ) . peekNilOr peeker) field idx
- StateOptions
- <$> peekStateField "request_headers"
- (stateOptsRequestHeaders opts)
- (peekList (peekPair peekText peekText))
- <*> peekStateField "resource_path"
- (stateOptsResourcePath opts)
- (peekList peekString)
- <*> peekOptStateField "user_data_dir"
- (stateOptsUserDataDir opts)
- peekString
+ absidx <- liftLua $ absindex idx
+ let setOptions opts = do
+ liftLua (next absidx) >>= \case
+ False -> return opts
+ True -> do
+ key <- peekByteString (nth 2)
+ case key of
+ "request_headers" -> do
+ let peekHeaderPair = peekPair peekText peekText
+ value <- peekList peekHeaderPair top `lastly` pop 1
+ setOptions $ opts { stateOptsRequestHeaders = value }
+ "resource_path" -> do
+ value <- peekList peekString top `lastly` pop 1
+ setOptions $ opts { stateOptsResourcePath = value }
+ "user_data_dir" -> do
+ value <- peekNilOr peekString top `lastly` pop 1
+ setOptions $ opts { stateOptsUserDataDir = value }
+ _ -> do
+ liftLua $ pop 2 -- remove key and value
+ failPeek $ "Unknown or unsupported state option: " <> key
+
+ liftLua pushnil -- first "key"
+ liftLua getStateOptions >>= setOptions
-- | Get the current options values from the pandoc state.
getStateOptions :: LuaE PandocError StateOptions
diff --git a/pandoc-lua-engine/test/lua/module/pandoc.lua b/pandoc-lua-engine/test/lua/module/pandoc.lua
index 1bb364f54..f9c58f5aa 100644
--- a/pandoc-lua-engine/test/lua/module/pandoc.lua
+++ b/pandoc-lua-engine/test/lua/module/pandoc.lua
@@ -490,12 +490,17 @@ return {
pandoc.with_state(opts, function () end)
assert.are_equal(PANDOC_STATE.user_data_dir, orig_user_data_dir)
end),
- test('unsupported options are ignored', function ()
+ test('unsupported options trigger an error', function ()
local orig_log = PANDOC_STATE.log
local opts = {log = 'nonsense'}
- pandoc.with_state(opts, function ()
- assert.are_same(PANDOC_STATE.log, orig_log)
- end)
+ assert.error_matches(
+ function ()
+ pandoc.with_state(opts, function ()
+ assert.are_same(PANDOC_STATE.log, orig_log)
+ end)
+ end,
+ "Unknown or unsupported"
+ )
assert.are_same(PANDOC_STATE.log, orig_log)
end),
},