Lua: let pandoc.with_state error on unknown options

Unknown or unsupported options now cause the `pandoc.with_state`
function to fail.

Closes: #11376
This commit is contained in:
Albert Krewinkel
2026-01-05 22:46:32 +01:00
parent 2a426718bc
commit e9c4d7f724
2 changed files with 32 additions and 19 deletions
@@ -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
+9 -4
View File
@@ -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),
},