Commit bf2bc39c30cd7f0208e838eef1b4b0671753c44c

Authored by Henry Schreiner
Committed by Henry Schreiner
1 parent 23cedc12

Rename to set_* on options and add return this

Now use type_name and type_size instead of set_custom_option.
CHANGELOG.md
@@ -36,6 +36,7 @@ Validators are now much more powerful [#118], all built in validators upgraded t @@ -36,6 +36,7 @@ Validators are now much more powerful [#118], all built in validators upgraded t
36 36
37 Other changes: 37 Other changes:
38 38
  39 +* Dropped `set_*` names on options, using `type_name` and `type_size` instead of `set_custom_option`. Methods return this.
39 * Added `->each()` to make adding custom callbacks easier [#126] 40 * Added `->each()` to make adding custom callbacks easier [#126]
40 * Added filter argument to `get_subcommands`, `get_options`; use empty filter `{}` to avoid filtering 41 * Added filter argument to `get_subcommands`, `get_options`; use empty filter `{}` to avoid filtering
41 * Added `get_groups()` to get groups 42 * Added `get_groups()` to get groups
README.md
@@ -180,7 +180,8 @@ The add commands return a pointer to an internally stored `Option`. If you set t @@ -180,7 +180,8 @@ The add commands return a pointer to an internally stored `Option`. If you set t
180 180
181 * `->required()`: The program will quit if this option is not present. This is `mandatory` in Plumbum, but required options seems to be a more standard term. For compatibility, `->mandatory()` also works. 181 * `->required()`: The program will quit if this option is not present. This is `mandatory` in Plumbum, but required options seems to be a more standard term. For compatibility, `->mandatory()` also works.
182 * `->expected(N)`: Take `N` values instead of as many as possible, only for vector args. If negative, require at least `-N`; end with `--` or another recognized option. 182 * `->expected(N)`: Take `N` values instead of as many as possible, only for vector args. If negative, require at least `-N`; end with `--` or another recognized option.
183 -* `->set_custom_option(typename, N)`: Set the name and (optional) intrinsic size of an option. The parser will require multiples of this number if negative. 183 +* `->type_name(typename)`: Set the name of an Option's type (`type_name_fn` allows a function instead)
  184 +* `->type_size(N)`: Set the intrinsic size of an option. The parser will require multiples of this number if negative.
184 * `->needs(opt)`: This option requires another option to also be present, opt is an `Option` pointer. 185 * `->needs(opt)`: This option requires another option to also be present, opt is an `Option` pointer.
185 * `->excludes(opt)`: This option cannot be given with `opt` present, opt is an `Option` pointer. 186 * `->excludes(opt)`: This option cannot be given with `opt` present, opt is an `Option` pointer.
186 * `->envname(name)`: Gets the value from the environment if present and not passed on the command line. 187 * `->envname(name)`: Gets the value from the environment if present and not passed on the command line.
examples/enum.cpp
@@ -17,7 +17,7 @@ int main(int argc, char **argv) { @@ -17,7 +17,7 @@ int main(int argc, char **argv) {
17 17
18 Level level; 18 Level level;
19 app.add_set("-l,--level", level, {Level::High, Level::Medium, Level::Low}, "Level settings") 19 app.add_set("-l,--level", level, {Level::High, Level::Medium, Level::Low}, "Level settings")
20 - ->set_type_name("enum/Level in {High=0, Medium=1, Low=2}"); 20 + ->type_name("enum/Level in {High=0, Medium=1, Low=2}");
21 21
22 CLI11_PARSE(app, argc, argv); 22 CLI11_PARSE(app, argc, argv);
23 23
include/CLI/App.hpp
@@ -331,7 +331,7 @@ class App { @@ -331,7 +331,7 @@ class App {
331 CLI::callback_t fun = [&variable](CLI::results_t res) { return detail::lexical_cast(res[0], variable); }; 331 CLI::callback_t fun = [&variable](CLI::results_t res) { return detail::lexical_cast(res[0], variable); };
332 332
333 Option *opt = add_option(name, fun, description, false); 333 Option *opt = add_option(name, fun, description, false);
334 - opt->set_custom_option(detail::type_name<T>()); 334 + opt->type_name(detail::type_name<T>());
335 return opt; 335 return opt;
336 } 336 }
337 337
@@ -345,11 +345,11 @@ class App { @@ -345,11 +345,11 @@ class App {
345 CLI::callback_t fun = [&variable](CLI::results_t res) { return detail::lexical_cast(res[0], variable); }; 345 CLI::callback_t fun = [&variable](CLI::results_t res) { return detail::lexical_cast(res[0], variable); };
346 346
347 Option *opt = add_option(name, fun, description, defaulted); 347 Option *opt = add_option(name, fun, description, defaulted);
348 - opt->set_custom_option(detail::type_name<T>()); 348 + opt->type_name(detail::type_name<T>());
349 if(defaulted) { 349 if(defaulted) {
350 std::stringstream out; 350 std::stringstream out;
351 out << variable; 351 out << variable;
352 - opt->set_default_str(out.str()); 352 + opt->default_str(out.str());
353 } 353 }
354 return opt; 354 return opt;
355 } 355 }
@@ -371,7 +371,7 @@ class App { @@ -371,7 +371,7 @@ class App {
371 }; 371 };
372 372
373 Option *opt = add_option(name, fun, description, false); 373 Option *opt = add_option(name, fun, description, false);
374 - opt->set_custom_option(detail::type_name<T>(), -1); 374 + opt->type_name(detail::type_name<T>())->type_size(-1);
375 return opt; 375 return opt;
376 } 376 }
377 377
@@ -393,9 +393,9 @@ class App { @@ -393,9 +393,9 @@ class App {
393 }; 393 };
394 394
395 Option *opt = add_option(name, fun, description, defaulted); 395 Option *opt = add_option(name, fun, description, defaulted);
396 - opt->set_custom_option(detail::type_name<T>(), -1); 396 + opt->type_name(detail::type_name<T>())->type_size(-1);
397 if(defaulted) 397 if(defaulted)
398 - opt->set_default_str("[" + detail::join(variable) + "]"); 398 + opt->default_str("[" + detail::join(variable) + "]");
399 return opt; 399 return opt;
400 } 400 }
401 401
@@ -440,7 +440,7 @@ class App { @@ -440,7 +440,7 @@ class App {
440 Option *opt = add_option(name, fun, description, false); 440 Option *opt = add_option(name, fun, description, false);
441 if(opt->get_positional()) 441 if(opt->get_positional())
442 throw IncorrectConstruction::PositionalFlag(name); 442 throw IncorrectConstruction::PositionalFlag(name);
443 - opt->set_custom_option("", 0); 443 + opt->type_size(0);
444 return opt; 444 return opt;
445 } 445 }
446 446
@@ -460,7 +460,7 @@ class App { @@ -460,7 +460,7 @@ class App {
460 Option *opt = add_option(name, fun, description, false); 460 Option *opt = add_option(name, fun, description, false);
461 if(opt->get_positional()) 461 if(opt->get_positional())
462 throw IncorrectConstruction::PositionalFlag(name); 462 throw IncorrectConstruction::PositionalFlag(name);
463 - opt->set_custom_option("", 0); 463 + opt->type_size(0);
464 return opt; 464 return opt;
465 } 465 }
466 466
@@ -480,7 +480,7 @@ class App { @@ -480,7 +480,7 @@ class App {
480 Option *opt = add_option(name, fun, description, false); 480 Option *opt = add_option(name, fun, description, false);
481 if(opt->get_positional()) 481 if(opt->get_positional())
482 throw IncorrectConstruction::PositionalFlag(name); 482 throw IncorrectConstruction::PositionalFlag(name);
483 - opt->set_custom_option("", 0); 483 + opt->type_size(0);
484 opt->multi_option_policy(CLI::MultiOptionPolicy::TakeLast); 484 opt->multi_option_policy(CLI::MultiOptionPolicy::TakeLast);
485 return opt; 485 return opt;
486 } 486 }
@@ -499,7 +499,7 @@ class App { @@ -499,7 +499,7 @@ class App {
499 Option *opt = add_option(name, fun, description, false); 499 Option *opt = add_option(name, fun, description, false);
500 if(opt->get_positional()) 500 if(opt->get_positional())
501 throw IncorrectConstruction::PositionalFlag(name); 501 throw IncorrectConstruction::PositionalFlag(name);
502 - opt->set_custom_option("", 0); 502 + opt->type_size(0);
503 return opt; 503 return opt;
504 } 504 }
505 505
@@ -530,7 +530,7 @@ class App { @@ -530,7 +530,7 @@ class App {
530 Option *opt = add_option(name, fun, description, false); 530 Option *opt = add_option(name, fun, description, false);
531 std::string typeval = detail::type_name<T>(); 531 std::string typeval = detail::type_name<T>();
532 typeval += " in {" + detail::join(options) + "}"; 532 typeval += " in {" + detail::join(options) + "}";
533 - opt->set_custom_option(typeval); 533 + opt->type_name(typeval);
534 return opt; 534 return opt;
535 } 535 }
536 536
@@ -550,7 +550,7 @@ class App { @@ -550,7 +550,7 @@ class App {
550 }; 550 };
551 551
552 Option *opt = add_option(name, fun, description, false); 552 Option *opt = add_option(name, fun, description, false);
553 - opt->set_type_name_fn( 553 + opt->type_name_fn(
554 [&options]() { return std::string(detail::type_name<T>()) + " in {" + detail::join(options) + "}"; }); 554 [&options]() { return std::string(detail::type_name<T>()) + " in {" + detail::join(options) + "}"; });
555 555
556 return opt; 556 return opt;
@@ -575,11 +575,11 @@ class App { @@ -575,11 +575,11 @@ class App {
575 Option *opt = add_option(name, fun, description, defaulted); 575 Option *opt = add_option(name, fun, description, defaulted);
576 std::string typeval = detail::type_name<T>(); 576 std::string typeval = detail::type_name<T>();
577 typeval += " in {" + detail::join(options) + "}"; 577 typeval += " in {" + detail::join(options) + "}";
578 - opt->set_custom_option(typeval); 578 + opt->type_name(typeval);
579 if(defaulted) { 579 if(defaulted) {
580 std::stringstream out; 580 std::stringstream out;
581 out << member; 581 out << member;
582 - opt->set_default_str(out.str()); 582 + opt->default_str(out.str());
583 } 583 }
584 return opt; 584 return opt;
585 } 585 }
@@ -601,12 +601,12 @@ class App { @@ -601,12 +601,12 @@ class App {
601 }; 601 };
602 602
603 Option *opt = add_option(name, fun, description, defaulted); 603 Option *opt = add_option(name, fun, description, defaulted);
604 - opt->set_type_name_fn( 604 + opt->type_name_fn(
605 [&options]() { return std::string(detail::type_name<T>()) + " in {" + detail::join(options) + "}"; }); 605 [&options]() { return std::string(detail::type_name<T>()) + " in {" + detail::join(options) + "}"; });
606 if(defaulted) { 606 if(defaulted) {
607 std::stringstream out; 607 std::stringstream out;
608 out << member; 608 out << member;
609 - opt->set_default_str(out.str()); 609 + opt->default_str(out.str());
610 } 610 }
611 return opt; 611 return opt;
612 } 612 }
@@ -634,7 +634,7 @@ class App { @@ -634,7 +634,7 @@ class App {
634 Option *opt = add_option(name, fun, description, false); 634 Option *opt = add_option(name, fun, description, false);
635 std::string typeval = detail::type_name<std::string>(); 635 std::string typeval = detail::type_name<std::string>();
636 typeval += " in {" + detail::join(options) + "}"; 636 typeval += " in {" + detail::join(options) + "}";
637 - opt->set_custom_option(typeval); 637 + opt->type_name(typeval);
638 638
639 return opt; 639 return opt;
640 } 640 }
@@ -660,7 +660,7 @@ class App { @@ -660,7 +660,7 @@ class App {
660 }; 660 };
661 661
662 Option *opt = add_option(name, fun, description, false); 662 Option *opt = add_option(name, fun, description, false);
663 - opt->set_type_name_fn([&options]() { 663 + opt->type_name_fn([&options]() {
664 return std::string(detail::type_name<std::string>()) + " in {" + detail::join(options) + "}"; 664 return std::string(detail::type_name<std::string>()) + " in {" + detail::join(options) + "}";
665 }); 665 });
666 666
@@ -691,9 +691,9 @@ class App { @@ -691,9 +691,9 @@ class App {
691 Option *opt = add_option(name, fun, description, defaulted); 691 Option *opt = add_option(name, fun, description, defaulted);
692 std::string typeval = detail::type_name<std::string>(); 692 std::string typeval = detail::type_name<std::string>();
693 typeval += " in {" + detail::join(options) + "}"; 693 typeval += " in {" + detail::join(options) + "}";
694 - opt->set_custom_option(typeval); 694 + opt->type_name(typeval);
695 if(defaulted) { 695 if(defaulted) {
696 - opt->set_default_str(member); 696 + opt->default_str(member);
697 } 697 }
698 return opt; 698 return opt;
699 } 699 }
@@ -720,11 +720,11 @@ class App { @@ -720,11 +720,11 @@ class App {
720 }; 720 };
721 721
722 Option *opt = add_option(name, fun, description, defaulted); 722 Option *opt = add_option(name, fun, description, defaulted);
723 - opt->set_type_name_fn([&options]() { 723 + opt->type_name_fn([&options]() {
724 return std::string(detail::type_name<std::string>()) + " in {" + detail::join(options) + "}"; 724 return std::string(detail::type_name<std::string>()) + " in {" + detail::join(options) + "}";
725 }); 725 });
726 if(defaulted) { 726 if(defaulted) {
727 - opt->set_default_str(member); 727 + opt->default_str(member);
728 } 728 }
729 return opt; 729 return opt;
730 } 730 }
@@ -749,11 +749,11 @@ class App { @@ -749,11 +749,11 @@ class App {
749 }; 749 };
750 750
751 CLI::Option *opt = add_option(name, fun, description, defaulted); 751 CLI::Option *opt = add_option(name, fun, description, defaulted);
752 - opt->set_custom_option(label, 2); 752 + opt->type_name(label)->type_size(2);
753 if(defaulted) { 753 if(defaulted) {
754 std::stringstream out; 754 std::stringstream out;
755 out << variable; 755 out << variable;
756 - opt->set_default_str(out.str()); 756 + opt->default_str(out.str());
757 } 757 }
758 return opt; 758 return opt;
759 } 759 }
include/CLI/Option.hpp
@@ -174,7 +174,7 @@ class Option : public OptionBase&lt;Option&gt; { @@ -174,7 +174,7 @@ class Option : public OptionBase&lt;Option&gt; {
174 /// A human readable type value, set when App creates this 174 /// A human readable type value, set when App creates this
175 /// 175 ///
176 /// This is a lambda function so "types" can be dynamic, such as when a set prints its contents. 176 /// This is a lambda function so "types" can be dynamic, such as when a set prints its contents.
177 - std::function<std::string()> type_name_; 177 + std::function<std::string()> type_name_{[]() { return std::string(); }};
178 178
179 /// True if this option has a default 179 /// True if this option has a default
180 bool default_{false}; 180 bool default_{false};
@@ -285,7 +285,7 @@ class Option : public OptionBase&lt;Option&gt; { @@ -285,7 +285,7 @@ class Option : public OptionBase&lt;Option&gt; {
285 Option *check(const Validator &validator) { 285 Option *check(const Validator &validator) {
286 validators_.emplace_back(validator.func); 286 validators_.emplace_back(validator.func);
287 if(!validator.tname.empty()) 287 if(!validator.tname.empty())
288 - set_type_name(validator.tname); 288 + type_name(validator.tname);
289 return this; 289 return this;
290 } 290 }
291 291
@@ -630,15 +630,17 @@ class Option : public OptionBase&lt;Option&gt; { @@ -630,15 +630,17 @@ class Option : public OptionBase&lt;Option&gt; {
630 } 630 }
631 631
632 /// Puts a result at the end 632 /// Puts a result at the end
633 - void add_result(std::string s) { 633 + Option *add_result(std::string s) {
634 results_.push_back(s); 634 results_.push_back(s);
635 callback_run_ = false; 635 callback_run_ = false;
  636 + return this;
636 } 637 }
637 638
638 /// Set the results vector all at once 639 /// Set the results vector all at once
639 - void set_results(std::vector<std::string> results) { 640 + Option *set_results(std::vector<std::string> results) {
640 results_ = results; 641 results_ = results;
641 callback_run_ = false; 642 callback_run_ = false;
  643 + return this;
642 } 644 }
643 645
644 /// Get a copy of the results 646 /// Get a copy of the results
@@ -651,36 +653,44 @@ class Option : public OptionBase&lt;Option&gt; { @@ -651,36 +653,44 @@ class Option : public OptionBase&lt;Option&gt; {
651 /// @name Custom options 653 /// @name Custom options
652 ///@{ 654 ///@{
653 655
654 - /// Set a custom option, typestring, type_size  
655 - void set_custom_option(std::string typeval, int type_size = 1) {  
656 - set_type_name(typeval); 656 + /// Set the type function to run when displayed on this option
  657 + Option *type_name_fn(std::function<std::string()> typefun) {
  658 + type_name_ = typefun;
  659 + return this;
  660 + }
  661 +
  662 + /// Set a custom option typestring
  663 + Option *type_name(std::string typeval) {
  664 + type_name_fn([typeval]() { return typeval; });
  665 + return this;
  666 + }
  667 +
  668 + /// Set a custom option size
  669 + Option *type_size(int type_size) {
657 type_size_ = type_size; 670 type_size_ = type_size;
658 if(type_size_ == 0) 671 if(type_size_ == 0)
659 required_ = false; 672 required_ = false;
660 if(type_size < 0) 673 if(type_size < 0)
661 expected_ = -1; 674 expected_ = -1;
  675 + return this;
662 } 676 }
663 677
664 /// Set the default value string representation 678 /// Set the default value string representation
665 - void set_default_str(std::string val) { defaultval_ = val; } 679 + Option *default_str(std::string val) {
  680 + defaultval_ = val;
  681 + return this;
  682 + }
666 683
667 /// Set the default value string representation and evaluate 684 /// Set the default value string representation and evaluate
668 - void set_default_val(std::string val) {  
669 - set_default_str(val); 685 + Option *default_val(std::string val) {
  686 + default_str(val);
670 auto old_results = results_; 687 auto old_results = results_;
671 results_ = {val}; 688 results_ = {val};
672 run_callback(); 689 run_callback();
673 results_ = std::move(old_results); 690 results_ = std::move(old_results);
  691 + return this;
674 } 692 }
675 693
676 - /// Set the type name displayed on this option  
677 - void set_type_name(std::string typeval) {  
678 - set_type_name_fn([typeval]() { return typeval; });  
679 - }  
680 -  
681 - /// Set the type function to run when displayed on this option  
682 - void set_type_name_fn(std::function<std::string()> typefun) { type_name_ = typefun; }  
683 -  
684 /// Get the typename for this option 694 /// Get the typename for this option
685 std::string get_type_name() const { return type_name_(); } 695 std::string get_type_name() const { return type_name_(); }
686 }; 696 };
tests/AppTest.cpp
@@ -1504,7 +1504,7 @@ TEST_F(TApp, CustomDoubleOption) { @@ -1504,7 +1504,7 @@ TEST_F(TApp, CustomDoubleOption) {
1504 custom_opt = {stol(vals.at(0)), stod(vals.at(1))}; 1504 custom_opt = {stol(vals.at(0)), stod(vals.at(1))};
1505 return true; 1505 return true;
1506 }); 1506 });
1507 - opt->set_custom_option("INT FLOAT", 2); 1507 + opt->type_name("INT FLOAT")->type_size(2);
1508 1508
1509 args = {"12", "1.5"}; 1509 args = {"12", "1.5"};
1510 1510
tests/HelpTest.cpp
@@ -222,8 +222,8 @@ TEST(THelp, ManualSetters) { @@ -222,8 +222,8 @@ TEST(THelp, ManualSetters) {
222 int x = 1; 222 int x = 1;
223 223
224 CLI::Option *op1 = app.add_option("--op", x); 224 CLI::Option *op1 = app.add_option("--op", x);
225 - op1->set_default_str("12");  
226 - op1->set_type_name("BIGGLES"); 225 + op1->default_str("12");
  226 + op1->type_name("BIGGLES");
227 EXPECT_EQ(x, 1); 227 EXPECT_EQ(x, 1);
228 228
229 std::string help = app.help(); 229 std::string help = app.help();
@@ -231,7 +231,7 @@ TEST(THelp, ManualSetters) { @@ -231,7 +231,7 @@ TEST(THelp, ManualSetters) {
231 EXPECT_THAT(help, HasSubstr("=12")); 231 EXPECT_THAT(help, HasSubstr("=12"));
232 EXPECT_THAT(help, HasSubstr("BIGGLES")); 232 EXPECT_THAT(help, HasSubstr("BIGGLES"));
233 233
234 - op1->set_default_val("14"); 234 + op1->default_val("14");
235 EXPECT_EQ(x, 14); 235 EXPECT_EQ(x, 14);
236 help = app.help(); 236 help = app.help();
237 EXPECT_THAT(help, HasSubstr("=14")); 237 EXPECT_THAT(help, HasSubstr("=14"));
@@ -556,7 +556,7 @@ TEST(THelp, CustomDoubleOption) { @@ -556,7 +556,7 @@ TEST(THelp, CustomDoubleOption) {
556 custom_opt = {stol(vals.at(0)), stod(vals.at(1))}; 556 custom_opt = {stol(vals.at(0)), stod(vals.at(1))};
557 return true; 557 return true;
558 }); 558 });
559 - opt->set_custom_option("INT FLOAT", 2); 559 + opt->type_name("INT FLOAT")->type_size(2);
560 560
561 EXPECT_THAT(app.help(), Not(HasSubstr("x 2"))); 561 EXPECT_THAT(app.help(), Not(HasSubstr("x 2")));
562 } 562 }
tests/NewParseTest.cpp
@@ -17,11 +17,11 @@ add_option(CLI::App &amp;app, std::string name, cx &amp;variable, std::string descriptio @@ -17,11 +17,11 @@ add_option(CLI::App &amp;app, std::string name, cx &amp;variable, std::string descriptio
17 }; 17 };
18 18
19 CLI::Option *opt = app.add_option(name, fun, description, defaulted); 19 CLI::Option *opt = app.add_option(name, fun, description, defaulted);
20 - opt->set_custom_option("COMPLEX", 2); 20 + opt->type_name("COMPLEX")->type_size(2);
21 if(defaulted) { 21 if(defaulted) {
22 std::stringstream out; 22 std::stringstream out;
23 out << variable; 23 out << variable;
24 - opt->set_default_str(out.str()); 24 + opt->default_str(out.str());
25 } 25 }
26 return opt; 26 return opt;
27 } 27 }