Skip to content

Commit

Permalink
Merge branch 'validate-required' of https://github.com/girtsf/Clara i…
Browse files Browse the repository at this point in the history
…nto girtsf-validate-required
  • Loading branch information
grafikrobot committed Aug 13, 2019
2 parents e02e1b1 + c08079b commit 8d6f122
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 2 deletions.
10 changes: 9 additions & 1 deletion include/lyra/cli_parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,15 @@ class cli_parser : parser_base
return parse_result::runtimeError(
"Unrecognized token: " + result.value().remainingTokens()->name);
}
// !TBD Check missing required options
// Check missing required options.
for (auto & parseInfo : parseInfos)
{
if (!parseInfo.parser->is_optional() && parseInfo.count == 0)
{
return parse_result::runtimeError(
"Expected: " + parseInfo.parser->get_usage_text());
}
}
return result;
}

Expand Down
1 change: 0 additions & 1 deletion tests/combined_parser_run_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ int main()
| opt( config.seed, "time|value" )
["--rng-seed"]["-r"]
("set a specific seed for random numbers" )
.required()
| opt( config.name, "name" )
["-n"]["--name"]
( "the name to use" )
Expand Down
82 changes: 82 additions & 0 deletions tests/required_run_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
Copyright Rene Rivera 2019
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
*/

#include <lyra/lyra.hpp>
#include "mini_test.hpp"

int main()
{
using namespace lyra;
bfg::mini_test::scope test;

// no .required() or .optional()
{
std::string name;
int number = 1;
auto cli =
opt(name, "name")["--name"]
| opt(number, "number")["--number"];
auto result = cli.parse({ "TestApp", "--name", "foo" });
test
(REQUIRE(result))
(REQUIRE(name == "foo"))
(REQUIRE(number == 1));
}
// .optional() and value present
{
std::string name;
int number = 1;
auto cli =
opt(name, "name")["--name"].optional()
| opt(number, "number")["--number"];
auto result = cli.parse({ "TestApp", "--name", "foo" });
test
(REQUIRE(result))
(REQUIRE(name == "foo"))
(REQUIRE(number == 1));
}
// .optional() and value not present
{
std::string name;
int number = 1;
auto cli =
opt(name, "name")["--name"].optional()
| opt(number, "number")["--number"];
auto result = cli.parse({ "TestApp", "--number", "42" });
test
(REQUIRE(result))
(REQUIRE(name == ""))
(REQUIRE(number == 42));
}
// .required() and value present
{
std::string name;
int number = 1;
auto cli =
opt(name, "name")["--name"].required()
| opt(number, "number")["--number"];
auto result = cli.parse({ "TestApp", "--name", "foo" });
test
(REQUIRE(result))
(REQUIRE(name == "foo"))
(REQUIRE(number == 1));
}
// .required() and value not present
{
std::string name;
int number = 1;
auto cli =
opt(name, "name")["--name"].required()
| opt(number, "number")["--number"];
auto result = cli.parse({ "TestApp", "--number", "42" });
test
(REQUIRE(!result))
(REQUIRE(result.errorMessage() == "Expected: --name"));
}

return test;
}

0 comments on commit 8d6f122

Please sign in to comment.