mu-command-parser: do not allow unknown parameters

We were simply ignoring unknown parameters; but it's better to raise an
error, as it's likely unintented (typo or otherwise)
This commit is contained in:
Dirk-Jan C. Binnema 2020-02-17 23:32:38 +02:00
parent e1f797cd1a
commit ac164b7e26
2 changed files with 14 additions and 2 deletions

View File

@ -82,6 +82,13 @@ Command::invoke(const Command::CommandMap& cmap, const Node& call)
" but got " + to_string(param_it->type)); " but got " + to_string(param_it->type));
} }
// all passed parameters must be known
for (size_t i = 1; i < params.size(); i += 2) {
if (std::none_of(cinfo.args.begin(), cinfo.args.end(),
[&](auto&& arg) {return params[i].value == ":" + arg.first;}))
throw command_error("unknown parameter '" + params[i].value + "'");
}
if (cinfo.handler) if (cinfo.handler)
cinfo.handler(params); cinfo.handler(params);
} }

View File

@ -63,9 +63,11 @@ static void
test_command() test_command()
{ {
using namespace Command; using namespace Command;
allow_warnings();
CommandMap cmap; CommandMap cmap;
cmap.emplace("my-command", cmap.emplace("my-command",
CommandInfo{ CommandInfo{
ArgMap{ {"param1", ArgInfo{Sexp::Type::String, true, "some string" }}, ArgMap{ {"param1", ArgInfo{Sexp::Type::String, true, "some string" }},
@ -77,13 +79,15 @@ test_command()
g_assert_true(call(cmap, "(my-command :param1 \"hello\")")); g_assert_true(call(cmap, "(my-command :param1 \"hello\")"));
g_assert_true(call(cmap, "(my-command :param1 \"hello\" :param2 123)")); g_assert_true(call(cmap, "(my-command :param1 \"hello\" :param2 123)"));
g_assert_true(call(cmap, "(my-command :param1 \"hello\" :param2 123 :param3 xxx)"));
g_assert_false(call(cmap, "(my-command :param1 \"hello\" :param2 123 :param3 xxx)"));
} }
static void static void
test_command2() test_command2()
{ {
using namespace Command; using namespace Command;
allow_warnings();
CommandMap cmap; CommandMap cmap;
cmap.emplace("bla", cmap.emplace("bla",
@ -95,7 +99,8 @@ test_command2()
[&](const auto& params){}}); [&](const auto& params){}});
g_assert_true (call(cmap, "(bla :foo nil :bla nil)")); g_assert_true (call(cmap, "(bla :foo nil)"));
g_assert_false (call(cmap, "(bla :foo nil :bla nil)"));
} }