mirror of https://github.com/djcb/mu.git
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:
parent
e1f797cd1a
commit
ac164b7e26
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue