mirror of
https://github.com/CLIUtils/CLI11.git
synced 2025-04-29 20:23:55 +00:00
Rename to set_* on options and add return this
Now use type_name and type_size instead of set_custom_option.
This commit is contained in:
parent
23cedc12e8
commit
bf2bc39c30
@ -36,6 +36,7 @@ Validators are now much more powerful [#118], all built in validators upgraded t
|
|||||||
|
|
||||||
Other changes:
|
Other changes:
|
||||||
|
|
||||||
|
* Dropped `set_*` names on options, using `type_name` and `type_size` instead of `set_custom_option`. Methods return this.
|
||||||
* Added `->each()` to make adding custom callbacks easier [#126]
|
* Added `->each()` to make adding custom callbacks easier [#126]
|
||||||
* Added filter argument to `get_subcommands`, `get_options`; use empty filter `{}` to avoid filtering
|
* Added filter argument to `get_subcommands`, `get_options`; use empty filter `{}` to avoid filtering
|
||||||
* Added `get_groups()` to get groups
|
* Added `get_groups()` to get groups
|
||||||
|
@ -180,7 +180,8 @@ The add commands return a pointer to an internally stored `Option`. If you set t
|
|||||||
|
|
||||||
* `->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.
|
* `->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.
|
||||||
* `->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.
|
* `->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.
|
||||||
* `->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.
|
* `->type_name(typename)`: Set the name of an Option's type (`type_name_fn` allows a function instead)
|
||||||
|
* `->type_size(N)`: Set the intrinsic size of an option. The parser will require multiples of this number if negative.
|
||||||
* `->needs(opt)`: This option requires another option to also be present, opt is an `Option` pointer.
|
* `->needs(opt)`: This option requires another option to also be present, opt is an `Option` pointer.
|
||||||
* `->excludes(opt)`: This option cannot be given with `opt` present, opt is an `Option` pointer.
|
* `->excludes(opt)`: This option cannot be given with `opt` present, opt is an `Option` pointer.
|
||||||
* `->envname(name)`: Gets the value from the environment if present and not passed on the command line.
|
* `->envname(name)`: Gets the value from the environment if present and not passed on the command line.
|
||||||
|
@ -17,7 +17,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
Level level;
|
Level level;
|
||||||
app.add_set("-l,--level", level, {Level::High, Level::Medium, Level::Low}, "Level settings")
|
app.add_set("-l,--level", level, {Level::High, Level::Medium, Level::Low}, "Level settings")
|
||||||
->set_type_name("enum/Level in {High=0, Medium=1, Low=2}");
|
->type_name("enum/Level in {High=0, Medium=1, Low=2}");
|
||||||
|
|
||||||
CLI11_PARSE(app, argc, argv);
|
CLI11_PARSE(app, argc, argv);
|
||||||
|
|
||||||
|
@ -331,7 +331,7 @@ class App {
|
|||||||
CLI::callback_t fun = [&variable](CLI::results_t res) { return detail::lexical_cast(res[0], variable); };
|
CLI::callback_t fun = [&variable](CLI::results_t res) { return detail::lexical_cast(res[0], variable); };
|
||||||
|
|
||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
opt->set_custom_option(detail::type_name<T>());
|
opt->type_name(detail::type_name<T>());
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,11 +345,11 @@ class App {
|
|||||||
CLI::callback_t fun = [&variable](CLI::results_t res) { return detail::lexical_cast(res[0], variable); };
|
CLI::callback_t fun = [&variable](CLI::results_t res) { return detail::lexical_cast(res[0], variable); };
|
||||||
|
|
||||||
Option *opt = add_option(name, fun, description, defaulted);
|
Option *opt = add_option(name, fun, description, defaulted);
|
||||||
opt->set_custom_option(detail::type_name<T>());
|
opt->type_name(detail::type_name<T>());
|
||||||
if(defaulted) {
|
if(defaulted) {
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
out << variable;
|
out << variable;
|
||||||
opt->set_default_str(out.str());
|
opt->default_str(out.str());
|
||||||
}
|
}
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
@ -371,7 +371,7 @@ class App {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
opt->set_custom_option(detail::type_name<T>(), -1);
|
opt->type_name(detail::type_name<T>())->type_size(-1);
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,9 +393,9 @@ class App {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Option *opt = add_option(name, fun, description, defaulted);
|
Option *opt = add_option(name, fun, description, defaulted);
|
||||||
opt->set_custom_option(detail::type_name<T>(), -1);
|
opt->type_name(detail::type_name<T>())->type_size(-1);
|
||||||
if(defaulted)
|
if(defaulted)
|
||||||
opt->set_default_str("[" + detail::join(variable) + "]");
|
opt->default_str("[" + detail::join(variable) + "]");
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,7 +440,7 @@ class App {
|
|||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
if(opt->get_positional())
|
if(opt->get_positional())
|
||||||
throw IncorrectConstruction::PositionalFlag(name);
|
throw IncorrectConstruction::PositionalFlag(name);
|
||||||
opt->set_custom_option("", 0);
|
opt->type_size(0);
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,7 +460,7 @@ class App {
|
|||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
if(opt->get_positional())
|
if(opt->get_positional())
|
||||||
throw IncorrectConstruction::PositionalFlag(name);
|
throw IncorrectConstruction::PositionalFlag(name);
|
||||||
opt->set_custom_option("", 0);
|
opt->type_size(0);
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -480,7 +480,7 @@ class App {
|
|||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
if(opt->get_positional())
|
if(opt->get_positional())
|
||||||
throw IncorrectConstruction::PositionalFlag(name);
|
throw IncorrectConstruction::PositionalFlag(name);
|
||||||
opt->set_custom_option("", 0);
|
opt->type_size(0);
|
||||||
opt->multi_option_policy(CLI::MultiOptionPolicy::TakeLast);
|
opt->multi_option_policy(CLI::MultiOptionPolicy::TakeLast);
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
@ -499,7 +499,7 @@ class App {
|
|||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
if(opt->get_positional())
|
if(opt->get_positional())
|
||||||
throw IncorrectConstruction::PositionalFlag(name);
|
throw IncorrectConstruction::PositionalFlag(name);
|
||||||
opt->set_custom_option("", 0);
|
opt->type_size(0);
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -530,7 +530,7 @@ class App {
|
|||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
std::string typeval = detail::type_name<T>();
|
std::string typeval = detail::type_name<T>();
|
||||||
typeval += " in {" + detail::join(options) + "}";
|
typeval += " in {" + detail::join(options) + "}";
|
||||||
opt->set_custom_option(typeval);
|
opt->type_name(typeval);
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -550,7 +550,7 @@ class App {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
opt->set_type_name_fn(
|
opt->type_name_fn(
|
||||||
[&options]() { return std::string(detail::type_name<T>()) + " in {" + detail::join(options) + "}"; });
|
[&options]() { return std::string(detail::type_name<T>()) + " in {" + detail::join(options) + "}"; });
|
||||||
|
|
||||||
return opt;
|
return opt;
|
||||||
@ -575,11 +575,11 @@ class App {
|
|||||||
Option *opt = add_option(name, fun, description, defaulted);
|
Option *opt = add_option(name, fun, description, defaulted);
|
||||||
std::string typeval = detail::type_name<T>();
|
std::string typeval = detail::type_name<T>();
|
||||||
typeval += " in {" + detail::join(options) + "}";
|
typeval += " in {" + detail::join(options) + "}";
|
||||||
opt->set_custom_option(typeval);
|
opt->type_name(typeval);
|
||||||
if(defaulted) {
|
if(defaulted) {
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
out << member;
|
out << member;
|
||||||
opt->set_default_str(out.str());
|
opt->default_str(out.str());
|
||||||
}
|
}
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
@ -601,12 +601,12 @@ class App {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Option *opt = add_option(name, fun, description, defaulted);
|
Option *opt = add_option(name, fun, description, defaulted);
|
||||||
opt->set_type_name_fn(
|
opt->type_name_fn(
|
||||||
[&options]() { return std::string(detail::type_name<T>()) + " in {" + detail::join(options) + "}"; });
|
[&options]() { return std::string(detail::type_name<T>()) + " in {" + detail::join(options) + "}"; });
|
||||||
if(defaulted) {
|
if(defaulted) {
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
out << member;
|
out << member;
|
||||||
opt->set_default_str(out.str());
|
opt->default_str(out.str());
|
||||||
}
|
}
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
@ -634,7 +634,7 @@ class App {
|
|||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
std::string typeval = detail::type_name<std::string>();
|
std::string typeval = detail::type_name<std::string>();
|
||||||
typeval += " in {" + detail::join(options) + "}";
|
typeval += " in {" + detail::join(options) + "}";
|
||||||
opt->set_custom_option(typeval);
|
opt->type_name(typeval);
|
||||||
|
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
@ -660,7 +660,7 @@ class App {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Option *opt = add_option(name, fun, description, false);
|
Option *opt = add_option(name, fun, description, false);
|
||||||
opt->set_type_name_fn([&options]() {
|
opt->type_name_fn([&options]() {
|
||||||
return std::string(detail::type_name<std::string>()) + " in {" + detail::join(options) + "}";
|
return std::string(detail::type_name<std::string>()) + " in {" + detail::join(options) + "}";
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -691,9 +691,9 @@ class App {
|
|||||||
Option *opt = add_option(name, fun, description, defaulted);
|
Option *opt = add_option(name, fun, description, defaulted);
|
||||||
std::string typeval = detail::type_name<std::string>();
|
std::string typeval = detail::type_name<std::string>();
|
||||||
typeval += " in {" + detail::join(options) + "}";
|
typeval += " in {" + detail::join(options) + "}";
|
||||||
opt->set_custom_option(typeval);
|
opt->type_name(typeval);
|
||||||
if(defaulted) {
|
if(defaulted) {
|
||||||
opt->set_default_str(member);
|
opt->default_str(member);
|
||||||
}
|
}
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
@ -720,11 +720,11 @@ class App {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Option *opt = add_option(name, fun, description, defaulted);
|
Option *opt = add_option(name, fun, description, defaulted);
|
||||||
opt->set_type_name_fn([&options]() {
|
opt->type_name_fn([&options]() {
|
||||||
return std::string(detail::type_name<std::string>()) + " in {" + detail::join(options) + "}";
|
return std::string(detail::type_name<std::string>()) + " in {" + detail::join(options) + "}";
|
||||||
});
|
});
|
||||||
if(defaulted) {
|
if(defaulted) {
|
||||||
opt->set_default_str(member);
|
opt->default_str(member);
|
||||||
}
|
}
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
@ -749,11 +749,11 @@ class App {
|
|||||||
};
|
};
|
||||||
|
|
||||||
CLI::Option *opt = add_option(name, fun, description, defaulted);
|
CLI::Option *opt = add_option(name, fun, description, defaulted);
|
||||||
opt->set_custom_option(label, 2);
|
opt->type_name(label)->type_size(2);
|
||||||
if(defaulted) {
|
if(defaulted) {
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
out << variable;
|
out << variable;
|
||||||
opt->set_default_str(out.str());
|
opt->default_str(out.str());
|
||||||
}
|
}
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,7 @@ class Option : public OptionBase<Option> {
|
|||||||
/// A human readable type value, set when App creates this
|
/// A human readable type value, set when App creates this
|
||||||
///
|
///
|
||||||
/// This is a lambda function so "types" can be dynamic, such as when a set prints its contents.
|
/// This is a lambda function so "types" can be dynamic, such as when a set prints its contents.
|
||||||
std::function<std::string()> type_name_;
|
std::function<std::string()> type_name_{[]() { return std::string(); }};
|
||||||
|
|
||||||
/// True if this option has a default
|
/// True if this option has a default
|
||||||
bool default_{false};
|
bool default_{false};
|
||||||
@ -285,7 +285,7 @@ class Option : public OptionBase<Option> {
|
|||||||
Option *check(const Validator &validator) {
|
Option *check(const Validator &validator) {
|
||||||
validators_.emplace_back(validator.func);
|
validators_.emplace_back(validator.func);
|
||||||
if(!validator.tname.empty())
|
if(!validator.tname.empty())
|
||||||
set_type_name(validator.tname);
|
type_name(validator.tname);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -630,15 +630,17 @@ class Option : public OptionBase<Option> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Puts a result at the end
|
/// Puts a result at the end
|
||||||
void add_result(std::string s) {
|
Option *add_result(std::string s) {
|
||||||
results_.push_back(s);
|
results_.push_back(s);
|
||||||
callback_run_ = false;
|
callback_run_ = false;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the results vector all at once
|
/// Set the results vector all at once
|
||||||
void set_results(std::vector<std::string> results) {
|
Option *set_results(std::vector<std::string> results) {
|
||||||
results_ = results;
|
results_ = results;
|
||||||
callback_run_ = false;
|
callback_run_ = false;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get a copy of the results
|
/// Get a copy of the results
|
||||||
@ -651,36 +653,44 @@ class Option : public OptionBase<Option> {
|
|||||||
/// @name Custom options
|
/// @name Custom options
|
||||||
///@{
|
///@{
|
||||||
|
|
||||||
/// Set a custom option, typestring, type_size
|
/// Set the type function to run when displayed on this option
|
||||||
void set_custom_option(std::string typeval, int type_size = 1) {
|
Option *type_name_fn(std::function<std::string()> typefun) {
|
||||||
set_type_name(typeval);
|
type_name_ = typefun;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set a custom option typestring
|
||||||
|
Option *type_name(std::string typeval) {
|
||||||
|
type_name_fn([typeval]() { return typeval; });
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set a custom option size
|
||||||
|
Option *type_size(int type_size) {
|
||||||
type_size_ = type_size;
|
type_size_ = type_size;
|
||||||
if(type_size_ == 0)
|
if(type_size_ == 0)
|
||||||
required_ = false;
|
required_ = false;
|
||||||
if(type_size < 0)
|
if(type_size < 0)
|
||||||
expected_ = -1;
|
expected_ = -1;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the default value string representation
|
/// Set the default value string representation
|
||||||
void set_default_str(std::string val) { defaultval_ = val; }
|
Option *default_str(std::string val) {
|
||||||
|
defaultval_ = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the default value string representation and evaluate
|
/// Set the default value string representation and evaluate
|
||||||
void set_default_val(std::string val) {
|
Option *default_val(std::string val) {
|
||||||
set_default_str(val);
|
default_str(val);
|
||||||
auto old_results = results_;
|
auto old_results = results_;
|
||||||
results_ = {val};
|
results_ = {val};
|
||||||
run_callback();
|
run_callback();
|
||||||
results_ = std::move(old_results);
|
results_ = std::move(old_results);
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the type name displayed on this option
|
|
||||||
void set_type_name(std::string typeval) {
|
|
||||||
set_type_name_fn([typeval]() { return typeval; });
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set the type function to run when displayed on this option
|
|
||||||
void set_type_name_fn(std::function<std::string()> typefun) { type_name_ = typefun; }
|
|
||||||
|
|
||||||
/// Get the typename for this option
|
/// Get the typename for this option
|
||||||
std::string get_type_name() const { return type_name_(); }
|
std::string get_type_name() const { return type_name_(); }
|
||||||
};
|
};
|
||||||
|
@ -1504,7 +1504,7 @@ TEST_F(TApp, CustomDoubleOption) {
|
|||||||
custom_opt = {stol(vals.at(0)), stod(vals.at(1))};
|
custom_opt = {stol(vals.at(0)), stod(vals.at(1))};
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
opt->set_custom_option("INT FLOAT", 2);
|
opt->type_name("INT FLOAT")->type_size(2);
|
||||||
|
|
||||||
args = {"12", "1.5"};
|
args = {"12", "1.5"};
|
||||||
|
|
||||||
|
@ -222,8 +222,8 @@ TEST(THelp, ManualSetters) {
|
|||||||
int x = 1;
|
int x = 1;
|
||||||
|
|
||||||
CLI::Option *op1 = app.add_option("--op", x);
|
CLI::Option *op1 = app.add_option("--op", x);
|
||||||
op1->set_default_str("12");
|
op1->default_str("12");
|
||||||
op1->set_type_name("BIGGLES");
|
op1->type_name("BIGGLES");
|
||||||
EXPECT_EQ(x, 1);
|
EXPECT_EQ(x, 1);
|
||||||
|
|
||||||
std::string help = app.help();
|
std::string help = app.help();
|
||||||
@ -231,7 +231,7 @@ TEST(THelp, ManualSetters) {
|
|||||||
EXPECT_THAT(help, HasSubstr("=12"));
|
EXPECT_THAT(help, HasSubstr("=12"));
|
||||||
EXPECT_THAT(help, HasSubstr("BIGGLES"));
|
EXPECT_THAT(help, HasSubstr("BIGGLES"));
|
||||||
|
|
||||||
op1->set_default_val("14");
|
op1->default_val("14");
|
||||||
EXPECT_EQ(x, 14);
|
EXPECT_EQ(x, 14);
|
||||||
help = app.help();
|
help = app.help();
|
||||||
EXPECT_THAT(help, HasSubstr("=14"));
|
EXPECT_THAT(help, HasSubstr("=14"));
|
||||||
@ -556,7 +556,7 @@ TEST(THelp, CustomDoubleOption) {
|
|||||||
custom_opt = {stol(vals.at(0)), stod(vals.at(1))};
|
custom_opt = {stol(vals.at(0)), stod(vals.at(1))};
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
opt->set_custom_option("INT FLOAT", 2);
|
opt->type_name("INT FLOAT")->type_size(2);
|
||||||
|
|
||||||
EXPECT_THAT(app.help(), Not(HasSubstr("x 2")));
|
EXPECT_THAT(app.help(), Not(HasSubstr("x 2")));
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,11 @@ add_option(CLI::App &app, std::string name, cx &variable, std::string descriptio
|
|||||||
};
|
};
|
||||||
|
|
||||||
CLI::Option *opt = app.add_option(name, fun, description, defaulted);
|
CLI::Option *opt = app.add_option(name, fun, description, defaulted);
|
||||||
opt->set_custom_option("COMPLEX", 2);
|
opt->type_name("COMPLEX")->type_size(2);
|
||||||
if(defaulted) {
|
if(defaulted) {
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
out << variable;
|
out << variable;
|
||||||
opt->set_default_str(out.str());
|
opt->default_str(out.str());
|
||||||
}
|
}
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user