Commit cb7c3ff85a2f26e855f23599981d417856e20b1a

Authored by Henry Fredrick Schreiner
Committed by Henry Schreiner
1 parent fc35014d

Move to using remaining, drop return from parse

examples/prefix_command.cpp
... ... @@ -8,13 +8,14 @@ int main(int argc, char **argv) {
8 8 std::vector<int> vals;
9 9 app.add_option("--vals,-v", vals)->expected(1);
10 10  
11   - std::vector<std::string> more_comms;
12 11 try {
13   - more_comms = app.parse(argc, argv);
  12 + app.parse(argc, argv);
14 13 } catch(const CLI::ParseError &e) {
15 14 return app.exit(e);
16 15 }
17 16  
  17 + std::vector<std::string> more_comms = app.remaining();
  18 +
18 19 std::cout << "Prefix:";
19 20 for(int v : vals)
20 21 std::cout << v << ":";
... ...
include/CLI/App.hpp
... ... @@ -626,21 +626,20 @@ class App {
626 626  
627 627 /// Parses the command line - throws errors
628 628 /// This must be called after the options are in but before the rest of the program.
629   - std::vector<std::string> parse(int argc, char **argv) {
  629 + void parse(int argc, char **argv) {
630 630 name_ = argv[0];
631 631 std::vector<std::string> args;
632 632 for(int i = argc - 1; i > 0; i--)
633 633 args.emplace_back(argv[i]);
634   - return parse(args);
  634 + parse(args);
635 635 }
636 636  
637 637 /// The real work is done here. Expects a reversed vector.
638 638 /// Changes the vector to the remaining options.
639   - std::vector<std::string> &parse(std::vector<std::string> &args) {
  639 + void parse(std::vector<std::string> &args) {
640 640 _validate();
641 641 _parse(args);
642 642 run_callback();
643   - return args;
644 643 }
645 644  
646 645 /// Print a nice error message and return the exit code
... ... @@ -872,6 +871,15 @@ class App {
872 871 return miss_list;
873 872 }
874 873  
  874 + /// This returns the number of remaining options, minus the -- seperator
  875 + size_t remaining_size() const {
  876 + return std::count_if(
  877 + std::begin(missing_), std::end(missing_),
  878 + [](const std::pair<detail::Classifer, std::string> &val) {
  879 + return val.first != detail::Classifer::POSITIONAL_MARK;
  880 + });
  881 + }
  882 +
875 883 ///@}
876 884  
877 885 protected:
... ... @@ -1020,17 +1028,10 @@ class App {
1020 1028  
1021 1029 // Convert missing (pairs) to extras (string only)
1022 1030 if(parent_ == nullptr) {
1023   - args.resize(missing()->size());
1024   - std::transform(std::begin(*missing()),
1025   - std::end(*missing()),
1026   - std::begin(args),
1027   - [](const std::pair<detail::Classifer, std::string> &val) { return val.second; });
  1031 + args = remaining();
1028 1032 std::reverse(std::begin(args), std::end(args));
1029 1033  
1030   - size_t num_left_over = std::count_if(
1031   - std::begin(*missing()), std::end(*missing()), [](std::pair<detail::Classifer, std::string> &val) {
1032   - return val.first != detail::Classifer::POSITIONAL_MARK;
1033   - });
  1034 + size_t num_left_over = remaining_size();
1034 1035  
1035 1036 if(num_left_over > 0 && !(allow_extras_ || prefix_command_))
1036 1037 throw ExtrasError("[" + detail::rjoin(args, " ") + "]");
... ...
tests/AppTest.cpp
... ... @@ -917,10 +917,10 @@ TEST_F(TApp, AllowExtras) {
917 917 EXPECT_FALSE(val);
918 918  
919 919 args = {"-x", "-f"};
920   - std::vector<std::string> left_over;
921   - EXPECT_NO_THROW({ left_over = run(); });
  920 +
  921 + EXPECT_NO_THROW(run());
922 922 EXPECT_TRUE(val);
923   - EXPECT_EQ(std::vector<std::string>({"-x"}), left_over);
  923 + EXPECT_EQ(app.remaining(), std::vector<std::string>({"-x"}));
924 924 }
925 925  
926 926 TEST_F(TApp, AllowExtrasOrder) {
... ... @@ -928,14 +928,13 @@ TEST_F(TApp, AllowExtrasOrder) {
928 928 app.allow_extras();
929 929  
930 930 args = {"-x", "-f"};
931   - std::vector<std::string> left_over;
932   - EXPECT_NO_THROW({ left_over = run(); });
933   - EXPECT_EQ(std::vector<std::string>({"-f", "-x"}), left_over);
  931 + EXPECT_NO_THROW(run());
  932 + EXPECT_EQ(app.remaining(), std::vector<std::string>({"-x", "-f"}));
934 933 app.reset();
935 934  
936   - std::vector<std::string> left_over_2;
937   - left_over_2 = app.parse(left_over);
938   - EXPECT_EQ(left_over, left_over_2);
  935 + std::vector<std::string> left_over = app.remaining();
  936 + app.parse(left_over);
  937 + EXPECT_EQ(app.remaining(), left_over);
939 938 }
940 939  
941 940 // Test horrible error
... ...
tests/SubcommandTest.cpp
... ... @@ -339,9 +339,9 @@ TEST_F(TApp, PrefixProgram) {
339 339 app.add_flag("--simple");
340 340  
341 341 args = {"--simple", "other", "--simple", "--mine"};
342   - auto ret_args = run();
  342 + run();
343 343  
344   - EXPECT_EQ(ret_args, std::vector<std::string>({"--mine", "--simple", "other"}));
  344 + EXPECT_EQ(app.remaining(), std::vector<std::string>({"other", "--simple", "--mine"}));
345 345 }
346 346  
347 347 struct SubcommandProgram : public TApp {
... ...
tests/app_helper.hpp
... ... @@ -15,10 +15,10 @@ struct TApp : public ::testing::Test {
15 15 CLI::App app{"My Test Program"};
16 16 input_t args;
17 17  
18   - std::vector<std::string> run() {
  18 + void run() {
19 19 input_t newargs = args;
20 20 std::reverse(std::begin(newargs), std::end(newargs));
21   - return app.parse(newargs);
  21 + app.parse(newargs);
22 22 }
23 23 };
24 24  
... ...