Go to the documentation of this file.
47 std::string
group_ = std::string(
"Options");
74 template <
typename T>
void copy_to(T *other)
const {
90 CRTP *
group(
const std::string &name) {
92 return static_cast<CRTP *
>(
this);
98 return static_cast<CRTP *
>(
this);
106 return static_cast<CRTP *
>(
this);
142 auto self =
static_cast<CRTP *
>(
this);
149 auto self =
static_cast<CRTP *
>(
this);
156 auto self =
static_cast<CRTP *
>(
this);
163 auto self =
static_cast<CRTP *
>(
this);
170 auto self =
static_cast<CRTP *
>(
this);
179 return static_cast<CRTP *
>(
this);
185 return static_cast<CRTP *
>(
this);
267 std::function<std::string()>
type_name_{[]() {
return std::string(); }};
351 explicit operator bool()
const {
return !
empty(); }
388 value_min = -value_min;
394 if(value_max < value_min) {
426 if(!validator_name.empty())
433 std::string Validator_description =
"",
434 std::string Validator_name =
"") {
435 validators_.emplace_back(
Validator, std::move(Validator_description), std::move(Validator_name));
443 if(!Validator_name.empty())
450 std::string transform_description =
"",
451 std::string transform_name =
"") {
454 [func](std::string &val) {
456 return std::string{};
458 std::move(transform_description),
459 std::move(transform_name)));
467 [func](std::string &inout) {
469 return std::string{};
481 if((Validator_name.empty()) && (!
validators_.empty())) {
484 throw OptionNotFound(std::string{
"Validator "} + Validator_name +
" Not Found");
490 if(index >= 0 && index <
static_cast<int>(
validators_.size())) {
506 auto opt =
dynamic_cast<T *
>(
parent_)->get_option_no_throw(opt_name);
508 throw IncorrectConstruction::MissingOption(opt_name);
514 template <
typename A,
typename B,
typename... ARG>
Option *
needs(A opt, B opt1, ARG... args) {
516 return needs(opt1, args...);
521 auto iterator = std::find(std::begin(
needs_), std::end(
needs_), opt);
523 if(iterator == std::end(
needs_)) {
548 auto opt =
dynamic_cast<T *
>(
parent_)->get_option_no_throw(opt_name);
550 throw IncorrectConstruction::MissingOption(opt_name);
556 template <
typename A,
typename B,
typename... ARG>
Option *
excludes(A opt, B opt1, ARG... args) {
585 auto *parent =
dynamic_cast<T *
>(
parent_);
586 for(
const Option_p &opt : parent->options_) {
587 if(opt.get() ==
this) {
590 auto &omatch = opt->matching_name(*
this);
591 if(!omatch.empty()) {
610 auto *parent =
dynamic_cast<T *
>(
parent_);
611 for(
const Option_p &opt : parent->options_) {
612 if(opt.get() ==
this) {
615 auto &omatch = opt->matching_name(*
this);
616 if(!omatch.empty()) {
618 throw OptionAlreadyAdded(
"adding ignore underscore caused a name conflict with " + omatch);
728 bool all_options =
false
735 std::vector<std::string> name_list;
739 name_list.push_back(
pname_);
742 for(
const std::string &sname :
snames_) {
743 name_list.push_back(
"-" + sname);
749 for(
const std::string &lname :
lnames_) {
750 name_list.push_back(
"--" + lname);
756 for(
const std::string &sname :
snames_)
757 name_list.push_back(
"-" + sname);
759 for(
const std::string &lname :
lnames_)
760 name_list.push_back(
"--" + lname);
772 return std::string(2,
'-') +
lnames_[0];
776 return std::string(1,
'-') +
snames_[0];
804 bool local_result =
callback_(send_results);
813 static const std::string estring;
814 for(
const std::string &sname :
snames_)
815 if(other.check_sname(sname))
817 for(
const std::string &lname :
lnames_)
818 if(other.check_lname(lname))
823 for(
const std::string &sname : other.snames_)
826 for(
const std::string &lname : other.lnames_)
838 if(name.length() > 2 && name[0] ==
'-' && name[1] ==
'-')
840 if(name.length() > 1 && name.front() ==
'-')
843 std::string local_pname =
pname_;
852 return name == local_pname;
875 std::string
get_flag_value(
const std::string &name, std::string input_value)
const {
876 static const std::string trueString{
"true"};
877 static const std::string falseString{
"false"};
878 static const std::string emptyString{
"{}"};
881 if(!((input_value.empty()) || (input_value == emptyString))) {
883 if(default_ind >= 0) {
886 throw(ArgumentMismatch::FlagOverride(name));
889 if(input_value != trueString) {
890 throw(ArgumentMismatch::FlagOverride(name));
896 if((input_value.empty()) || (input_value == emptyString)) {
909 return (val == 1) ? falseString : (val == (-1) ? trueString :
std::to_string(-val));
910 }
catch(
const std::invalid_argument &) {
920 _add_result(std::move(s),
results_);
927 results_added = _add_result(std::move(s),
results_);
935 _add_result(std::move(str),
results_);
950 _validate_results(res);
954 _reduce_results(extra, res);
956 res = std::move(extra);
969 retval = detail::lexical_conversion<T, T>(res, output);
976 _validate_results(res);
978 _reduce_results(extra, res);
980 res = std::move(extra);
988 retval = detail::lexical_conversion<T, T>(res, output);
996 template <
typename T> T
as()
const {
1023 if(option_type_size < 0) {
1040 if(option_type_size_min < 0 || option_type_size_max < 0) {
1043 option_type_size_min = (std::abs)(option_type_size_min);
1044 option_type_size_max = (std::abs)(option_type_size_max);
1047 if(option_type_size_min > option_type_size_max) {
1113 if(!vtype.empty()) {
1114 full_type_name +=
":" + vtype;
1118 return full_type_name;
1123 void _validate_results(
results_t &res)
const {
1134 for(std::string &result : res) {
1139 auto err_msg = _validate(result, (index >= 0) ? (index %
type_size_max_) : index);
1140 if(!err_msg.empty())
1151 for(std::string &result : res) {
1152 auto err_msg = _validate(result, index);
1154 if(!err_msg.empty())
1176 std::size_t trim_size = std::min<std::size_t>(
1178 if(original.size() != trim_size) {
1179 res.assign(original.end() -
static_cast<results_t::difference_type
>(trim_size), original.end());
1183 std::size_t trim_size = std::min<std::size_t>(
1185 if(original.size() != trim_size) {
1186 res.assign(original.begin(), original.begin() +
static_cast<results_t::difference_type
>(trim_size));
1204 if(original.size() < num_min) {
1205 throw ArgumentMismatch::AtLeast(
get_name(),
static_cast<int>(num_min), original.size());
1207 if(original.size() > num_max) {
1208 throw ArgumentMismatch::AtMost(
get_name(),
static_cast<int>(num_max), original.size());
1216 std::string _validate(std::string &result,
int index)
const {
1217 std::string err_msg;
1223 auto v = vali.get_application_index();
1224 if(v == -1 || v == index) {
1226 err_msg = vali(result);
1227 }
catch(
const ValidationError &err) {
1228 err_msg = err.what();
1230 if(!err_msg.empty())
1239 int _add_result(std::string &&result, std::vector<std::string> &res)
const {
1240 int result_count = 0;
1242 result.back() ==
']') {
1247 result_count += _add_result(std::move(var), res);
1250 return result_count;
1253 res.push_back(std::move(result));
1256 if((result.find_first_of(
delimiter_) != std::string::npos)) {
1264 res.push_back(std::move(result));
1268 return result_count;
bool get_ignore_case() const
The status of ignore case.
Definition: Option.hpp:118
bool operator==(const Option &other) const
If options share any of the same names, they are equal (not counting positional)
Definition: Option.hpp:833
Option * transform(Validator Validator, const std::string &Validator_name="")
Adds a transforming Validator with a built in type name.
Definition: Option.hpp:441
bool get_always_capture_default() const
Return true if this will automatically capture the default value for help printing.
Definition: Option.hpp:133
CRTP * group(const std::string &name)
Changes the group membership.
Definition: Option.hpp:90
std::string default_str_
A human readable default value, either manually set, captured, or captured by default.
Definition: Option.hpp:262
results_t reduced_results() const
Get a copy of the results.
Definition: Option.hpp:945
bool check_name(std::string name) const
Check a name. Requires "-" or "--" for short / long, supports positional name.
Definition: Option.hpp:836
Option * ignore_case(bool value=true)
Definition: Option.hpp:582
std::string get_description() const
Generate type description information for the Validator.
Definition: Validators.hpp:125
std::string get_envname() const
The environment variable associated to this value.
Definition: Option.hpp:659
Option * disable_flag_override(bool value=true)
Disable flag overrides values, e.g. –flag=is not allowed.
Definition: Option.hpp:642
std::string get_default_str() const
The default value (for help printing)
Definition: Option.hpp:668
bool get_required() const
True if this is a required option.
Definition: Option.hpp:115
bool get_disable_flag_override() const
The status of configurable.
Definition: Option.hpp:127
CRTP * take_all()
Set the multi option policy to take all arguments.
Definition: Option.hpp:155
enabler
Simple empty scoped class.
Definition: TypeTools.hpp:22
char delimiter_
Specify a delimiter character for vector arguments.
Definition: Option.hpp:65
constexpr int expected_max_vector_size
Definition: StringTools.hpp:36
std::set< Option * > get_needs() const
The set of options needed.
Definition: Option.hpp:662
Option * add_result(std::vector< std::string > s)
Puts a result at the end.
Definition: Option.hpp:933
Option * default_function(const std::function< std::string()> &func)
Set a capture function for the default. Mostly used by App.
Definition: Option.hpp:1061
CRTP * join(char delim)
Set the multi option policy to join with a specific delimiter.
Definition: Option.hpp:169
std::string pname_
A positional name.
Definition: Option.hpp:249
Some validators that are provided.
Definition: Validators.hpp:61
OptionDefaults * ignore_underscore(bool value=true)
Ignore underscores in the option name.
Definition: Option.hpp:210
const std::vector< std::string > & get_lnames() const
Get the long names.
Definition: Option.hpp:674
@ validated
the results have been validated
std::vector< std::pair< std::string, std::string > > default_flag_values_
Definition: Option.hpp:243
std::vector< std::string > split(const std::string &s, char delim)
Split a string by a delim.
Definition: StringTools.hpp:39
int expected_min_
The minimum number of expected values.
Definition: Option.hpp:283
Option * transform(const std::function< std::string(std::string)> &func, std::string transform_description="", std::string transform_name="")
Adds a Validator-like function that can change result.
Definition: Option.hpp:449
Option * description(std::string option_description)
Set the description.
Definition: Option.hpp:714
bool flag_like_
Specify that the option should act like a flag vs regular option.
Definition: Option.hpp:326
std::vector< std::string > fnames_
a list of flag names with specified default values;
Definition: Option.hpp:246
int get_type_size_max() const
The maximum number of arguments the option expects.
Definition: Option.hpp:656
std::vector< std::string > snames_
A list of the short names (-a) without the leading dashes.
Definition: Option.hpp:236
results_t results() const
Get a copy of the results.
Definition: Option.hpp:942
int get_type_size_min() const
The minimum number of arguments the option expects.
Definition: Option.hpp:654
Option * each(const std::function< void(std::string)> &func)
Adds a user supplied function to run on each item passed in (communicate though lambda capture)
Definition: Option.hpp:465
MultiOptionPolicy multi_option_policy_
Policy for handling multiple arguments beyond the expected Max.
Definition: Option.hpp:71
bool get_positional() const
True if the argument can be given directly.
Definition: Option.hpp:702
bool get_configurable() const
The status of configurable.
Definition: Option.hpp:124
bool run_callback_for_default_
Control option to run the callback to set the default.
Definition: Option.hpp:328
int get_items_expected_max() const
Get the maximum number of items expected to be returned and used for the callback.
Definition: Option.hpp:694
@ TakeLast
take only the last Expected number of arguments
std::size_t count() const
Count the total number of times an option was passed.
Definition: Option.hpp:345
@ reduced
a subset of results has been generated
results_t results_
complete Results of parsing
Definition: Option.hpp:311
App * parent_
Remember the parent app.
Definition: Option.hpp:301
std::set< Option * > needs_
A list of options that are required with this option.
Definition: Option.hpp:291
Option * type_size(int option_type_size)
Set a custom option size.
Definition: Option.hpp:1022
std::string get_name(bool positional=false, bool all_options=false) const
Gets a comma separated list of names. Will include / prefer the positional name if positional is true...
Definition: Option.hpp:727
Option * expected(int value)
Set the number of expected arguments.
Definition: Option.hpp:364
@ Join
merge all the arguments together into a single string via the delimiter character default(' ')
bool has_description() const
True if option has description.
Definition: Option.hpp:708
int get_expected_max() const
The max number of times the option expects to be included.
Definition: Option.hpp:688
Thrown when conversion call back fails, such as when an int fails to coerce to a string.
Definition: Error.hpp:182
std::string join(const T &v, std::string delim=",")
Simple function to join a string.
Definition: StringTools.hpp:56
int type_size_min_
The minimum number of arguments an option should be expecting.
Definition: Option.hpp:280
bool check_fname(std::string name) const
Requires "--" to be removed from string.
Definition: Option.hpp:866
Option * envname(std::string name)
Sets environment variable to read if no option given.
Definition: Option.hpp:573
CRTP * take_first()
Set the multi option policy to take last.
Definition: Option.hpp:148
const std::string & get_name() const
Get the name of the Validator.
Definition: Validators.hpp:143
@ parsing
The option is currently collecting parsed results.
std::set< Option * > excludes_
A list of options that are excluded with this option.
Definition: Option.hpp:294
Option * excludes(Option *opt)
Sets excluded options.
Definition: Option.hpp:531
MultiOptionPolicy
Enumeration of the multiOption Policy selection.
Definition: Option.hpp:32
bool always_capture_default_
Automatically capture default value.
Definition: Option.hpp:68
callback_t callback_
Options store a callback to do all the work.
Definition: Option.hpp:304
auto to_string(T &&value) -> decltype(std::forward< T >(value))
Convert an object to a string (directly forward if this can become a string)
Definition: TypeTools.hpp:222
std::string envname_
If given, check the environment for this option.
Definition: Option.hpp:252
Validator * get_validator(const std::string &Validator_name="")
Get a named Validator.
Definition: Option.hpp:475
@ TakeAll
just get all the passed argument regardless
bool nonpositional() const
True if option has at least one non-positional name.
Definition: Option.hpp:705
Option * needs(Option *opt)
Sets required options.
Definition: Option.hpp:497
void copy_to(T *other) const
Copy the contents to another similar class (one based on OptionBase)
Definition: Option.hpp:74
constexpr enabler dummy
An instance to use in EnableIf.
Definition: TypeTools.hpp:25
Option * needs(std::string opt_name)
Can find a string if needed.
Definition: Option.hpp:505
std::function< std::string()> type_name_
Definition: Option.hpp:267
Option * add_result(std::string s, int &results_added)
Puts a result at the end and get a count of the number of arguments actually added.
Definition: Option.hpp:926
const std::vector< std::string > & get_snames() const
Get the short names.
Definition: Option.hpp:677
CRTP * delimiter(char value='\0')
Allow in a configuration file.
Definition: Option.hpp:183
Option * check(Validator validator, const std::string &validator_name="")
Adds a Validator with a built in type name.
Definition: Option.hpp:423
std::ptrdiff_t find_member(std::string name, const std::vector< std::string > names, bool ignore_case=false, bool ignore_underscore=false)
Check if a string is a member of a list of strings and optionally ignore case or ignore underscores.
Definition: StringTools.hpp:241
Option * needs(A opt, B opt1, ARG... args)
Any number supported, any mix of string and Opt.
Definition: Option.hpp:514
bool allow_extra_args_
Specify that extra args beyond type_size_max should be allowed.
Definition: Option.hpp:324
bool remove_excludes(Option *opt)
Remove needs link from an option. Returns true if the option really was in the needs list.
Definition: Option.hpp:562
Definition: Option.hpp:42
int expected_max_
The maximum number of expected values.
Definition: Option.hpp:285
All errors derive from this one.
Definition: Error.hpp:63
bool configurable_
Allow this option to be given in a configuration file.
Definition: Option.hpp:59
OptionDefaults * multi_option_policy(MultiOptionPolicy value=MultiOptionPolicy::Throw)
Take the last argument if given multiple times.
Definition: Option.hpp:198
Thrown when an option already exists.
Definition: Error.hpp:128
Option * default_val(const X &val)
Definition: Option.hpp:1082
Option * type_size(int option_type_size_min, int option_type_size_max)
Set a custom option type size range.
Definition: Option.hpp:1039
std::string get_flag_value(const std::string &name, std::string input_value) const
Definition: Option.hpp:875
CRTP * join()
Set the multi option policy to join.
Definition: Option.hpp:162
Option * type_name_fn(std::function< std::string()> typefun)
Set the type function to run when displayed on this option.
Definition: Option.hpp:1010
std::tuple< std::vector< std::string >, std::vector< std::string >, std::string > get_names(const std::vector< std::string > &input)
Get a vector of short names, one of long names, and a single name.
Definition: Split.hpp:99
std::function< bool(const results_t &)> callback_t
callback function definition
Definition: Option.hpp:25
Definition: Option.hpp:228
std::string to_lower(std::string str)
Return a lower case version of a string.
Definition: StringTools.hpp:196
std::vector< Validator > validators_
A list of Validators to run on each value parsed.
Definition: Option.hpp:288
int type_size_max_
Definition: Option.hpp:278
Option * excludes(std::string opt_name)
Can find a string if needed.
Definition: Option.hpp:547
Option * type_name(std::string typeval)
Set a custom option typestring.
Definition: Option.hpp:1016
@ TakeFirst
take only the first Expected number of arguments
Option * multi_option_policy(MultiOptionPolicy value=MultiOptionPolicy::Throw)
Take the last argument if given multiple times (or another policy)
Definition: Option.hpp:628
@ Throw
Throw an error if any extra arguments were given.
int get_items_expected() const
The total min number of expected string values to be used.
Definition: Option.hpp:699
std::string remove_underscore(std::string str)
remove underscores from a string
Definition: StringTools.hpp:204
Option * excludes(A opt, B opt1, ARG... args)
Any number supported, any mix of string and Opt.
Definition: Option.hpp:556
Option * run_callback_for_default(bool value=true)
Definition: Option.hpp:415
results_t proc_results_
results after reduction
Definition: Option.hpp:313
Option * expected(int value_min, int value_max)
Set the range of expected arguments.
Definition: Option.hpp:386
MultiOptionPolicy get_multi_option_policy() const
The status of the multi option policy.
Definition: Option.hpp:136
std::string group_
The group membership.
Definition: Option.hpp:47
const std::string & get_description() const
Get the description.
Definition: Option.hpp:711
bool get_callback_run() const
See if the callback has been run already.
Definition: Option.hpp:1003
CRTP * take_last()
Set the multi option policy to take last.
Definition: Option.hpp:141
void results(T &output) const
Get the results as a specified type.
Definition: Option.hpp:965
OptionDefaults * ignore_case(bool value=true)
Ignore the case of the option name.
Definition: Option.hpp:204
std::vector< std::string > results_t
Definition: Option.hpp:23
Option(std::string option_name, std::string option_description, callback_t callback, App *parent)
Making an option by hand is not defined, it must be made by the App class.
Definition: Option.hpp:332
Creates a command line program, with very few defaults.
Definition: App.hpp:61
int get_type_size() const
The number of arguments the option expects.
Definition: Option.hpp:651
const std::string & matching_name(const Option &other) const
If options share any of the same names, find it.
Definition: Option.hpp:812
bool check_sname(std::string name) const
Requires "-" to be removed from string.
Definition: Option.hpp:856
bool required_
True if this is a required option.
Definition: Option.hpp:50
Option * capture_default_str()
Capture the default value from the original value (if it can be captured)
Definition: Option.hpp:1067
T as() const
Return the results as the specified type.
Definition: Option.hpp:996
std::function< std::string()> default_function_
Run this function to capture a default (ignore if empty)
Definition: Option.hpp:270
Definition: Option.hpp:191
bool disable_flag_override_
Disable overriding flag values with '=value'.
Definition: Option.hpp:62
const std::string & get_group() const
Get the group of this option.
Definition: Option.hpp:112
const std::vector< std::string > & get_fnames() const
Get the flag names with specified default values.
Definition: Option.hpp:680
CRTP * configurable(bool value=true)
Allow in a configuration file.
Definition: Option.hpp:177
Option * ignore_underscore(bool value=true)
Definition: Option.hpp:606
option_state
enumeration for the option state machine
Definition: Option.hpp:315
Option * default_str(std::string val)
Set the default value string representation (does not change the contained value)
Definition: Option.hpp:1075
std::unique_ptr< Option > Option_p
Definition: Option.hpp:30
std::string get_type_name() const
Get the full typename for this option.
Definition: Option.hpp:1108
int64_t to_flag_value(std::string val)
Convert a flag into an integer value typically binary flags.
Definition: TypeTools.hpp:551
CRTP * always_capture_default(bool value=true)
Definition: Option.hpp:104
Validator * get_validator(int index)
Get a Validator by index NOTE: this may not be the order of definition.
Definition: Option.hpp:488
bool empty() const
True if the option was not passed.
Definition: Option.hpp:348
int get_items_expected_min() const
The total min number of expected string values to be used.
Definition: Option.hpp:691
int get_expected() const
The number of times the option expects to be included.
Definition: Option.hpp:683
Validator & non_modifying(bool no_modify=true)
Specify whether the Validator can be modifying or not.
Definition: Validators.hpp:157
std::set< Option * > get_excludes() const
The set of options excluded.
Definition: Option.hpp:665
std::enable_if< std::is_integral< T >::value, bool >::type checked_multiply(T &a, T b)
Performs a *= b; if it doesn't cause integer overflow. Returns false otherwise.
Definition: Validators.hpp:656
OptionDefaults * delimiter(char value='\0')
set a delimiter character to split up single arguments to treat as multiple inputs
Definition: Option.hpp:222
bool get_allow_extra_args() const
Get the current value of allow extra args.
Definition: Option.hpp:411
@ callback_run
the callback has been executed
option_state current_option_state_
Whether the callback has run (needed for INI parsing)
Definition: Option.hpp:322
Option * check(std::function< std::string(const std::string &)> Validator, std::string Validator_description="", std::string Validator_name="")
Adds a Validator. Takes a const string& and returns an error message (empty if conversion/check is ok...
Definition: Option.hpp:432
char get_delimiter() const
Get the current delimiter char.
Definition: Option.hpp:130
std::string description_
The description for help strings.
Definition: Option.hpp:259
Thrown when counting a non-existent option.
Definition: Error.hpp:326
CRTP * mandatory(bool value=true)
Support Plumbum term.
Definition: Option.hpp:102
int get_expected_min() const
The number of times the option expects to be included.
Definition: Option.hpp:686
CRTP * required(bool value=true)
Set the option as required.
Definition: Option.hpp:96
void clear()
Clear the parsed results (mostly for testing)
Definition: Option.hpp:354
std::vector< std::string > split_names(std::string current)
Definition: Split.hpp:59
Option & operator=(const Option &)=delete
Option * add_result(std::string s)
Puts a result at the end.
Definition: Option.hpp:919
OptionDefaults * disable_flag_override(bool value=true)
Disable overriding flag values with an '=' segment.
Definition: Option.hpp:216
std::vector< std::string > lnames_
A list of the long names (--long) without the leading dashes.
Definition: Option.hpp:239
bool check_lname(std::string name) const
Requires "--" to be removed from string.
Definition: Option.hpp:861
bool ignore_underscore_
Ignore underscores when matching (option, not value)
Definition: Option.hpp:56
bool ignore_case_
Ignore the case when matching (option, not value)
Definition: Option.hpp:53
void run_callback()
Process the callback.
Definition: Option.hpp:787
bool get_run_callback_for_default() const
Get the current value of run_callback_for_default.
Definition: Option.hpp:420
bool remove_needs(Option *opt)
Remove needs link from an option. Returns true if the option really was in the needs list.
Definition: Option.hpp:520
callback_t get_callback() const
Get the callback function.
Definition: Option.hpp:671
Thrown when an option is set to conflicting values (non-vector and multi args, for example)
Definition: Error.hpp:86
Option * allow_extra_args(bool value=true)
Definition: Option.hpp:406
bool get_ignore_underscore() const
The status of ignore_underscore.
Definition: Option.hpp:121