CLI11
C++11 Command Line Interface Parser
Loading...
Searching...
No Matches
Option.hpp
1// Copyright (c) 2017-2025, University of Cincinnati, developed by Henry Schreiner
2// under NSF AWARD 1414736 and by the respective contributors.
3// All rights reserved.
4//
5// SPDX-License-Identifier: BSD-3-Clause
6
7#pragma once
8
9// IWYU pragma: private, include "CLI/CLI.hpp"
10
11// [CLI11:public_includes:set]
12#include <algorithm>
13#include <functional>
14#include <memory>
15#include <set>
16#include <string>
17#include <tuple>
18#include <utility>
19#include <vector>
20// [CLI11:public_includes:end]
21
22#include "Error.hpp"
23#include "Macros.hpp"
24#include "Split.hpp"
25#include "StringTools.hpp"
26#include "Validators.hpp"
27
28namespace CLI {
29// [CLI11:option_hpp:verbatim]
30
31using results_t = std::vector<std::string>;
33using callback_t = std::function<bool(const results_t &)>;
34
35class Option;
36class App;
37class ConfigBase;
38
39using Option_p = std::unique_ptr<Option>;
41enum class MultiOptionPolicy : char {
42 Throw,
43 TakeLast,
44 TakeFirst,
45 Join,
46 TakeAll,
47 Sum,
48 Reverse,
49};
50
53template <typename CRTP> class OptionBase {
54 friend App;
55 friend ConfigBase;
56
57 protected:
59 std::string group_ = std::string("OPTIONS");
60
62 bool required_{false};
63
65 bool ignore_case_{false};
66
68 bool ignore_underscore_{false};
69
71 bool configurable_{true};
72
75
77 char delimiter_{'\0'};
78
81
83 MultiOptionPolicy multi_option_policy_{MultiOptionPolicy::Throw};
84
86 template <typename T> void copy_to(T *other) const;
87
88 public:
89 // setters
90
92 CRTP *group(const std::string &name) {
93 if(!detail::valid_alias_name_string(name)) {
94 throw IncorrectConstruction("Group names may not contain newlines or null characters");
95 }
96 group_ = name;
97 return static_cast<CRTP *>(this);
98 }
99
101 CRTP *required(bool value = true) {
102 required_ = value;
103 return static_cast<CRTP *>(this);
104 }
105
107 CRTP *mandatory(bool value = true) { return required(value); }
108
109 CRTP *always_capture_default(bool value = true) {
111 return static_cast<CRTP *>(this);
112 }
113
114 // Getters
115
117 CLI11_NODISCARD const std::string &get_group() const { return group_; }
118
120 CLI11_NODISCARD bool get_required() const { return required_; }
121
123 CLI11_NODISCARD bool get_ignore_case() const { return ignore_case_; }
124
126 CLI11_NODISCARD bool get_ignore_underscore() const { return ignore_underscore_; }
127
129 CLI11_NODISCARD bool get_configurable() const { return configurable_; }
130
132 CLI11_NODISCARD bool get_disable_flag_override() const { return disable_flag_override_; }
133
135 CLI11_NODISCARD char get_delimiter() const { return delimiter_; }
136
138 CLI11_NODISCARD bool get_always_capture_default() const { return always_capture_default_; }
139
141 CLI11_NODISCARD MultiOptionPolicy get_multi_option_policy() const { return multi_option_policy_; }
142
143 // Shortcuts for multi option policy
144
146 CRTP *take_last() {
147 auto *self = static_cast<CRTP *>(this);
148 self->multi_option_policy(MultiOptionPolicy::TakeLast);
149 return self;
150 }
151
153 CRTP *take_first() {
154 auto *self = static_cast<CRTP *>(this);
155 self->multi_option_policy(MultiOptionPolicy::TakeFirst);
156 return self;
157 }
158
160 CRTP *take_all() {
161 auto self = static_cast<CRTP *>(this);
162 self->multi_option_policy(MultiOptionPolicy::TakeAll);
163 return self;
164 }
165
167 CRTP *join() {
168 auto *self = static_cast<CRTP *>(this);
169 self->multi_option_policy(MultiOptionPolicy::Join);
170 return self;
171 }
172
174 CRTP *join(char delim) {
175 auto self = static_cast<CRTP *>(this);
176 self->delimiter_ = delim;
177 self->multi_option_policy(MultiOptionPolicy::Join);
178 return self;
179 }
180
182 CRTP *configurable(bool value = true) {
183 configurable_ = value;
184 return static_cast<CRTP *>(this);
185 }
186
188 CRTP *delimiter(char value = '\0') {
189 delimiter_ = value;
190 return static_cast<CRTP *>(this);
191 }
192};
193
196class OptionDefaults : public OptionBase<OptionDefaults> {
197 public:
198 OptionDefaults() = default;
199
200 // Methods here need a different implementation if they are Option vs. OptionDefault
201
203 OptionDefaults *multi_option_policy(MultiOptionPolicy value = MultiOptionPolicy::Throw) {
204 multi_option_policy_ = value;
205 return this;
206 }
207
209 OptionDefaults *ignore_case(bool value = true) {
210 ignore_case_ = value;
211 return this;
212 }
213
215 OptionDefaults *ignore_underscore(bool value = true) {
216 ignore_underscore_ = value;
217 return this;
218 }
219
223 return this;
224 }
225
227 OptionDefaults *delimiter(char value = '\0') {
228 delimiter_ = value;
229 return this;
230 }
231};
232
233class Option : public OptionBase<Option> {
234 friend App;
235 friend ConfigBase;
236
237 protected:
240
242 std::vector<std::string> snames_{};
243
245 std::vector<std::string> lnames_{};
246
249 std::vector<std::pair<std::string, std::string>> default_flag_values_{};
250
252 std::vector<std::string> fnames_{};
253
255 std::string pname_{};
256
258 std::string envname_{};
259
263
265 std::string description_{};
266
268 std::string default_str_{};
269
271 std::string option_text_{};
272
276 std::function<std::string()> type_name_{[]() { return std::string(); }};
277
279 std::function<std::string()> default_function_{};
280
284
290
295
297 std::vector<Validator> validators_{};
298
300 std::set<Option *> needs_{};
301
303 std::set<Option *> excludes_{};
304
308
310 App *parent_{nullptr};
311
313 callback_t callback_{};
314
318
320 results_t results_{};
322 results_t proc_results_{};
324 enum class option_state : char {
325 parsing = 0,
326 validated = 2,
327 reduced = 4,
328 callback_run = 6,
329 };
333 bool allow_extra_args_{false};
335 bool flag_like_{false};
339 bool inject_separator_{false};
343 bool force_callback_{false};
345
347 Option(std::string option_name,
348 std::string option_description,
349 callback_t callback,
350 App *parent,
351 bool allow_non_standard = false)
352 : description_(std::move(option_description)), parent_(parent), callback_(std::move(callback)) {
353 std::tie(snames_, lnames_, pname_) = detail::get_names(detail::split_names(option_name), allow_non_standard);
354 }
355
356 public:
359
360 Option(const Option &) = delete;
361 Option &operator=(const Option &) = delete;
362
364 CLI11_NODISCARD std::size_t count() const { return results_.size(); }
365
367 CLI11_NODISCARD bool empty() const { return results_.empty(); }
368
370 explicit operator bool() const { return !empty() || force_callback_; }
371
373 void clear() {
374 results_.clear();
376 }
377
381
383 Option *expected(int value);
384
386 Option *expected(int value_min, int value_max);
387
390 Option *allow_extra_args(bool value = true) {
391 allow_extra_args_ = value;
392 return this;
393 }
395 CLI11_NODISCARD bool get_allow_extra_args() const { return allow_extra_args_; }
397 Option *trigger_on_parse(bool value = true) {
398 trigger_on_result_ = value;
399 return this;
400 }
402 CLI11_NODISCARD bool get_trigger_on_parse() const { return trigger_on_result_; }
403
405 Option *force_callback(bool value = true) {
406 force_callback_ = value;
407 return this;
408 }
410 CLI11_NODISCARD bool get_force_callback() const { return force_callback_; }
411
414 Option *run_callback_for_default(bool value = true) {
416 return this;
417 }
419 CLI11_NODISCARD bool get_run_callback_for_default() const { return run_callback_for_default_; }
420
422 Option *check(Validator validator, const std::string &validator_name = "");
423
425 Option *check(std::function<std::string(const std::string &)> Validator,
426 std::string Validator_description = "",
427 std::string Validator_name = "");
428
430 Option *transform(Validator Validator, const std::string &Validator_name = "");
431
433 Option *transform(const std::function<std::string(std::string)> &func,
434 std::string transform_description = "",
435 std::string transform_name = "");
436
438 Option *each(const std::function<void(std::string)> &func);
439
441 Validator *get_validator(const std::string &Validator_name = "");
442
444 Validator *get_validator(int index);
445
448 if(opt != this) {
449 needs_.insert(opt);
450 }
451 return this;
452 }
453
455 template <typename T = App> Option *needs(std::string opt_name) {
456 auto opt = static_cast<T *>(parent_)->get_option_no_throw(opt_name);
457 if(opt == nullptr) {
458 throw IncorrectConstruction::MissingOption(opt_name);
459 }
460 return needs(opt);
461 }
462
464 template <typename A, typename B, typename... ARG> Option *needs(A opt, B opt1, ARG... args) {
465 needs(opt);
466 return needs(opt1, args...); // NOLINT(readability-suspicious-call-argument)
467 }
468
470 bool remove_needs(Option *opt);
471
473 Option *excludes(Option *opt);
474
476 template <typename T = App> Option *excludes(std::string opt_name) {
477 auto opt = static_cast<T *>(parent_)->get_option_no_throw(opt_name);
478 if(opt == nullptr) {
479 throw IncorrectConstruction::MissingOption(opt_name);
480 }
481 return excludes(opt);
482 }
483
485 template <typename A, typename B, typename... ARG> Option *excludes(A opt, B opt1, ARG... args) {
486 excludes(opt);
487 return excludes(opt1, args...);
488 }
489
491 bool remove_excludes(Option *opt);
492
494 Option *envname(std::string name) {
495 envname_ = std::move(name);
496 return this;
497 }
498
503 template <typename T = App> Option *ignore_case(bool value = true);
504
509 template <typename T = App> Option *ignore_underscore(bool value = true);
510
512 Option *multi_option_policy(MultiOptionPolicy value = MultiOptionPolicy::Throw);
513
515 Option *disable_flag_override(bool value = true) {
517 return this;
518 }
522
524 CLI11_NODISCARD int get_type_size() const { return type_size_min_; }
525
527 CLI11_NODISCARD int get_type_size_min() const { return type_size_min_; }
529 CLI11_NODISCARD int get_type_size_max() const { return type_size_max_; }
530
532 CLI11_NODISCARD bool get_inject_separator() const { return inject_separator_; }
533
535 CLI11_NODISCARD std::string get_envname() const { return envname_; }
536
538 CLI11_NODISCARD std::set<Option *> get_needs() const { return needs_; }
539
541 CLI11_NODISCARD std::set<Option *> get_excludes() const { return excludes_; }
542
544 CLI11_NODISCARD std::string get_default_str() const { return default_str_; }
545
547 CLI11_NODISCARD callback_t get_callback() const { return callback_; }
548
550 CLI11_NODISCARD const std::vector<std::string> &get_lnames() const { return lnames_; }
551
553 CLI11_NODISCARD const std::vector<std::string> &get_snames() const { return snames_; }
554
556 CLI11_NODISCARD const std::vector<std::string> &get_fnames() const { return fnames_; }
558 CLI11_NODISCARD const std::string &get_single_name() const {
559 if(!lnames_.empty()) {
560 return lnames_[0];
561 }
562 if(!snames_.empty()) {
563 return snames_[0];
564 }
565 if(!pname_.empty()) {
566 return pname_;
567 }
568 return envname_;
569 }
571 CLI11_NODISCARD int get_expected() const { return expected_min_; }
572
574 CLI11_NODISCARD int get_expected_min() const { return expected_min_; }
576 CLI11_NODISCARD int get_expected_max() const { return expected_max_; }
577
579 CLI11_NODISCARD int get_items_expected_min() const { return type_size_min_ * expected_min_; }
580
582 CLI11_NODISCARD int get_items_expected_max() const {
583 int t = type_size_max_;
584 return detail::checked_multiply(t, expected_max_) ? t : detail::expected_max_vector_size;
585 }
587 CLI11_NODISCARD int get_items_expected() const { return get_items_expected_min(); }
588
590 CLI11_NODISCARD bool get_positional() const { return !pname_.empty(); }
591
593 CLI11_NODISCARD bool nonpositional() const { return (!lnames_.empty() || !snames_.empty()); }
594
596 CLI11_NODISCARD bool has_description() const { return !description_.empty(); }
597
599 CLI11_NODISCARD const std::string &get_description() const { return description_; }
600
602 Option *description(std::string option_description) {
603 description_ = std::move(option_description);
604 return this;
605 }
606
607 Option *option_text(std::string text) {
608 option_text_ = std::move(text);
609 return this;
610 }
611
612 CLI11_NODISCARD const std::string &get_option_text() const { return option_text_; }
613
617
622 CLI11_NODISCARD std::string get_name(bool positional = false,
623 bool all_options = false
624 ) const;
625
629
631 void run_callback();
632
634 CLI11_NODISCARD const std::string &matching_name(const Option &other) const;
635
637 bool operator==(const Option &other) const { return !matching_name(other).empty(); }
638
640 CLI11_NODISCARD bool check_name(const std::string &name) const;
641
643 CLI11_NODISCARD bool check_sname(std::string name) const {
644 return (detail::find_member(std::move(name), snames_, ignore_case_) >= 0);
645 }
646
648 CLI11_NODISCARD bool check_lname(std::string name) const {
649 return (detail::find_member(std::move(name), lnames_, ignore_case_, ignore_underscore_) >= 0);
650 }
651
653 CLI11_NODISCARD bool check_fname(std::string name) const {
654 if(fnames_.empty()) {
655 return false;
656 }
657 return (detail::find_member(std::move(name), fnames_, ignore_case_, ignore_underscore_) >= 0);
658 }
659
662 CLI11_NODISCARD std::string get_flag_value(const std::string &name, std::string input_value) const;
663
665 Option *add_result(std::string s);
666
668 Option *add_result(std::string s, int &results_added);
669
671 Option *add_result(std::vector<std::string> s);
672
674 CLI11_NODISCARD const results_t &results() const { return results_; }
675
677 CLI11_NODISCARD results_t reduced_results() const;
678
680 template <typename T> void results(T &output) const {
681 bool retval = false;
682 if(current_option_state_ >= option_state::reduced || (results_.size() == 1 && validators_.empty())) {
683 const results_t &res = (proc_results_.empty()) ? results_ : proc_results_;
684 retval = detail::lexical_conversion<T, T>(res, output);
685 } else {
686 results_t res;
687 if(results_.empty()) {
688 if(!default_str_.empty()) {
689 // _add_results takes an rvalue only
690 _add_result(std::string(default_str_), res);
691 _validate_results(res);
692 results_t extra;
693 _reduce_results(extra, res);
694 if(!extra.empty()) {
695 res = std::move(extra);
696 }
697 } else {
698 res.emplace_back();
699 }
700 } else {
701 res = reduced_results();
702 }
703 retval = detail::lexical_conversion<T, T>(res, output);
704 }
705 if(!retval) {
707 }
708 }
709
711 template <typename T> CLI11_NODISCARD T as() const {
712 T output;
713 results(output);
714 return output;
715 }
716
718 CLI11_NODISCARD bool get_callback_run() const { return (current_option_state_ == option_state::callback_run); }
719
723
725 Option *type_name_fn(std::function<std::string()> typefun) {
726 type_name_ = std::move(typefun);
727 return this;
728 }
729
731 Option *type_name(std::string typeval) {
732 type_name_fn([typeval]() { return typeval; });
733 return this;
734 }
735
737 Option *type_size(int option_type_size);
738
740 Option *type_size(int option_type_size_min, int option_type_size_max);
741
743 void inject_separator(bool value = true) { inject_separator_ = value; }
744
746 Option *default_function(const std::function<std::string()> &func) {
747 default_function_ = func;
748 return this;
749 }
750
755 }
756 return this;
757 }
758
760 Option *default_str(std::string val) {
761 default_str_ = std::move(val);
762 return this;
763 }
764
767 template <typename X> Option *default_val(const X &val) {
768 std::string val_str = detail::to_string(val);
769 auto old_option_state = current_option_state_;
770 results_t old_results{std::move(results_)};
771 results_.clear();
772 try {
773 add_result(val_str);
774 // if trigger_on_result_ is set the callback already ran
776 run_callback(); // run callback sets the state, we need to reset it again
778 } else {
779 _validate_results(results_);
780 current_option_state_ = old_option_state;
781 }
782 } catch(const ConversionError &err) {
783 // this should be done
784 results_ = std::move(old_results);
785 current_option_state_ = old_option_state;
786
787 throw ConversionError(
788 get_name(), std::string("given default value(\"") + val_str + "\") produces an error : " + err.what());
789 } catch(const CLI::Error &) {
790 results_ = std::move(old_results);
791 current_option_state_ = old_option_state;
792 throw;
793 }
794 results_ = std::move(old_results);
795 default_str_ = std::move(val_str);
796 return this;
797 }
798
800 CLI11_NODISCARD std::string get_type_name() const;
801
802 private:
804 void _validate_results(results_t &res) const;
805
809 void _reduce_results(results_t &out, const results_t &original) const;
810
811 // Run a result through the Validators
812 std::string _validate(std::string &result, int index) const;
813
815 int _add_result(std::string &&result, std::vector<std::string> &res) const;
816};
817
818// [CLI11:option_hpp:end]
819} // namespace CLI
820
821#ifndef CLI11_COMPILE
822#include "impl/Option_inl.hpp" // IWYU pragma: export
823#endif
Creates a command line program, with very few defaults.
Definition App.hpp:98
This converter works with INI/TOML files; to write INI files use ConfigINI.
Definition ConfigFwd.hpp:85
Thrown when conversion call back fails, such as when an int fails to coerce to a string.
Definition Error.hpp:205
All errors derive from this one.
Definition Error.hpp:73
Thrown when an option is set to conflicting values (non-vector and multi args, for example)
Definition Error.hpp:96
Definition Option.hpp:53
CRTP * mandatory(bool value=true)
Support Plumbum term.
Definition Option.hpp:107
CRTP * take_all()
Set the multi option policy to take all arguments.
Definition Option.hpp:160
CRTP * group(const std::string &name)
Changes the group membership.
Definition Option.hpp:92
CRTP * join()
Set the multi option policy to join.
Definition Option.hpp:167
bool always_capture_default_
Automatically capture default value.
Definition Option.hpp:80
MultiOptionPolicy multi_option_policy_
Policy for handling multiple arguments beyond the expected Max.
Definition Option.hpp:83
CRTP * join(char delim)
Set the multi option policy to join with a specific delimiter.
Definition Option.hpp:174
CLI11_NODISCARD bool get_always_capture_default() const
Return true if this will automatically capture the default value for help printing.
Definition Option.hpp:138
CLI11_NODISCARD char get_delimiter() const
Get the current delimiter char.
Definition Option.hpp:135
CLI11_NODISCARD bool get_required() const
True if this is a required option.
Definition Option.hpp:120
CRTP * take_first()
Set the multi option policy to take last.
Definition Option.hpp:153
CLI11_NODISCARD bool get_ignore_case() const
The status of ignore case.
Definition Option.hpp:123
bool ignore_case_
Ignore the case when matching (option, not value)
Definition Option.hpp:65
CRTP * configurable(bool value=true)
Allow in a configuration file.
Definition Option.hpp:182
CRTP * delimiter(char value='\0')
Allow in a configuration file.
Definition Option.hpp:188
CLI11_NODISCARD MultiOptionPolicy get_multi_option_policy() const
The status of the multi option policy.
Definition Option.hpp:141
CLI11_NODISCARD bool get_configurable() const
The status of configurable.
Definition Option.hpp:129
bool configurable_
Allow this option to be given in a configuration file.
Definition Option.hpp:71
bool disable_flag_override_
Disable overriding flag values with '=value'.
Definition Option.hpp:74
bool required_
True if this is a required option.
Definition Option.hpp:62
CRTP * take_last()
Set the multi option policy to take last.
Definition Option.hpp:146
char delimiter_
Specify a delimiter character for vector arguments.
Definition Option.hpp:77
std::string group_
The group membership.
Definition Option.hpp:59
CLI11_NODISCARD bool get_ignore_underscore() const
The status of ignore_underscore.
Definition Option.hpp:126
bool ignore_underscore_
Ignore underscores when matching (option, not value)
Definition Option.hpp:68
CLI11_NODISCARD bool get_disable_flag_override() const
The status of configurable.
Definition Option.hpp:132
CLI11_NODISCARD const std::string & get_group() const
Get the group of this option.
Definition Option.hpp:117
void copy_to(T *other) const
Copy the contents to another similar class (one based on OptionBase)
Definition Option_inl.hpp:24
CRTP * required(bool value=true)
Set the option as required.
Definition Option.hpp:101
Definition Option.hpp:196
OptionDefaults * multi_option_policy(MultiOptionPolicy value=MultiOptionPolicy::Throw)
Take the last argument if given multiple times.
Definition Option.hpp:203
OptionDefaults * ignore_case(bool value=true)
Ignore the case of the option name.
Definition Option.hpp:209
OptionDefaults * ignore_underscore(bool value=true)
Ignore underscores in the option name.
Definition Option.hpp:215
OptionDefaults * delimiter(char value='\0')
set a delimiter character to split up single arguments to treat as multiple inputs
Definition Option.hpp:227
OptionDefaults * disable_flag_override(bool value=true)
Disable overriding flag values with an '=' segment.
Definition Option.hpp:221
Definition Option.hpp:233
Option * type_size(int option_type_size)
Set a custom option size.
Definition Option_inl.hpp:467
Option * expected(int value)
Set the number of expected arguments.
Definition Option_inl.hpp:36
CLI11_NODISCARD bool get_positional() const
True if the argument can be given directly.
Definition Option.hpp:590
std::string default_str_
A human readable default value, either manually set, captured, or captured by default.
Definition Option.hpp:268
bool run_callback_for_default_
Control option to run the callback to set the default.
Definition Option.hpp:337
CLI11_NODISCARD std::string get_envname() const
The environment variable associated to this value.
Definition Option.hpp:535
CLI11_NODISCARD bool check_name(const std::string &name) const
Check a name. Requires "-" or "--" for short / long, supports positional name.
Definition Option_inl.hpp:354
Option * type_name(std::string typeval)
Set a custom option typestring.
Definition Option.hpp:731
std::function< std::string()> type_name_
Definition Option.hpp:276
option_state
enumeration for the option state machine
Definition Option.hpp:324
@ reduced
a subset of results has been generated
@ callback_run
the callback has been executed
@ validated
the results have been validated
@ parsing
The option is currently collecting parsed results.
option_state current_option_state_
Whether the callback has run (needed for INI parsing)
Definition Option.hpp:331
std::string option_text_
If given, replace the text that describes the option type and usage in the help text.
Definition Option.hpp:271
int type_size_min_
The minimum number of arguments an option should be expecting.
Definition Option.hpp:289
CLI11_NODISCARD results_t reduced_results() const
Get a copy of the results.
Definition Option_inl.hpp:449
CLI11_NODISCARD std::string get_type_name() const
Get the full typename for this option.
Definition Option_inl.hpp:510
CLI11_NODISCARD bool check_fname(std::string name) const
Requires "--" to be removed from string.
Definition Option.hpp:653
std::string pname_
A positional name.
Definition Option.hpp:255
int expected_min_
The minimum number of expected values.
Definition Option.hpp:292
Option * ignore_case(bool value=true)
Definition Option_inl.hpp:179
std::set< Option * > needs_
A list of options that are required with this option.
Definition Option.hpp:300
Option * default_function(const std::function< std::string()> &func)
Set a capture function for the default. Mostly used by App.
Definition Option.hpp:746
CLI11_NODISCARD int get_type_size_min() const
The minimum number of arguments the option expects.
Definition Option.hpp:527
void run_callback()
Process the callback.
Definition Option_inl.hpp:286
CLI11_NODISCARD bool check_sname(std::string name) const
Requires "-" to be removed from string.
Definition Option.hpp:643
bool trigger_on_result_
flag indicating that the option should trigger the validation and callback chain on each result when ...
Definition Option.hpp:341
bool flag_like_
Specify that the option should act like a flag vs regular option.
Definition Option.hpp:335
CLI11_NODISCARD 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_inl.hpp:233
std::set< Option * > excludes_
A list of options that are excluded with this option.
Definition Option.hpp:303
bool force_callback_
flag indicating that the option should force the callback regardless if any results present
Definition Option.hpp:343
CLI11_NODISCARD bool get_callback_run() const
See if the callback has been run already.
Definition Option.hpp:718
CLI11_NODISCARD bool get_force_callback() const
The status of force_callback.
Definition Option.hpp:410
std::vector< std::string > fnames_
a list of flag names with specified default values;
Definition Option.hpp:252
Option(std::string option_name, std::string option_description, callback_t callback, App *parent, bool allow_non_standard=false)
Making an option by hand is not defined, it must be made by the App class.
Definition Option.hpp:347
CLI11_NODISCARD bool get_run_callback_for_default() const
Get the current value of run_callback_for_default.
Definition Option.hpp:419
CLI11_NODISCARD std::string get_default_str() const
The default value (for help printing)
Definition Option.hpp:544
CLI11_NODISCARD bool nonpositional() const
True if option has at least one non-positional name.
Definition Option.hpp:593
CLI11_NODISCARD int get_items_expected_min() const
The total min number of expected string values to be used.
Definition Option.hpp:579
CLI11_NODISCARD const std::string & matching_name(const Option &other) const
If options share any of the same names, find it.
Definition Option_inl.hpp:316
CLI11_NODISCARD bool check_lname(std::string name) const
Requires "--" to be removed from string.
Definition Option.hpp:648
CLI11_NODISCARD const results_t & results() const
Get the current complete results set.
Definition Option.hpp:674
Option * disable_flag_override(bool value=true)
Disable flag overrides values, e.g. –flag=is not allowed.
Definition Option.hpp:515
CLI11_NODISCARD int get_items_expected_max() const
Get the maximum number of items expected to be returned and used for the callback.
Definition Option.hpp:582
std::vector< std::string > snames_
A list of the short names (-a) without the leading dashes.
Definition Option.hpp:242
results_t proc_results_
results after reduction
Definition Option.hpp:322
bool remove_excludes(Option *opt)
Remove needs link from an option. Returns true if the option really was in the needs list.
Definition Option_inl.hpp:169
CLI11_NODISCARD std::size_t count() const
Count the total number of times an option was passed.
Definition Option.hpp:364
Option * run_callback_for_default(bool value=true)
Definition Option.hpp:414
void inject_separator(bool value=true)
Set the value of the separator injection flag.
Definition Option.hpp:743
Option * allow_extra_args(bool value=true)
Definition Option.hpp:390
Option * multi_option_policy(MultiOptionPolicy value=MultiOptionPolicy::Throw)
Take the last argument if given multiple times (or another policy)
Definition Option_inl.hpp:220
Option * trigger_on_parse(bool value=true)
Set the value of trigger_on_parse which specifies that the option callback should be triggered on eve...
Definition Option.hpp:397
CLI11_NODISCARD callback_t get_callback() const
Get the callback function.
Definition Option.hpp:547
CLI11_NODISCARD bool get_inject_separator() const
Return the inject_separator flag.
Definition Option.hpp:532
Option * excludes(Option *opt)
Sets excluded options.
Definition Option_inl.hpp:154
App * parent_
link back up to the parent App for fallthrough
Definition Option.hpp:310
CLI11_NODISCARD bool get_trigger_on_parse() const
The status of trigger on parse.
Definition Option.hpp:402
CLI11_NODISCARD const std::vector< std::string > & get_lnames() const
Get the long names.
Definition Option.hpp:550
int expected_max_
The maximum number of expected values.
Definition Option.hpp:294
CLI11_NODISCARD std::set< Option * > get_excludes() const
The set of options excluded.
Definition Option.hpp:541
CLI11_NODISCARD std::string get_flag_value(const std::string &name, std::string input_value) const
Definition Option_inl.hpp:383
Option * excludes(std::string opt_name)
Can find a string if needed.
Definition Option.hpp:476
CLI11_NODISCARD int get_items_expected() const
The total min number of expected string values to be used.
Definition Option.hpp:587
Validator * get_validator(const std::string &Validator_name="")
Get a named Validator.
Definition Option_inl.hpp:124
CLI11_NODISCARD std::set< Option * > get_needs() const
The set of options needed.
Definition Option.hpp:538
std::string description_
The description for help strings.
Definition Option.hpp:265
CLI11_NODISCARD const std::vector< std::string > & get_snames() const
Get the short names.
Definition Option.hpp:553
CLI11_NODISCARD int get_type_size_max() const
The maximum number of arguments the option expects.
Definition Option.hpp:529
bool inject_separator_
flag indicating a separator needs to be injected after each argument call
Definition Option.hpp:339
Option * check(Validator validator, const std::string &validator_name="")
Adds a Validator with a built in type name.
Definition Option_inl.hpp:76
CLI11_NODISCARD const std::string & get_description() const
Get the description.
Definition Option.hpp:599
CLI11_NODISCARD const std::string & get_single_name() const
Get a single name for the option, first of lname, sname, pname, envname.
Definition Option.hpp:558
CLI11_NODISCARD int get_expected() const
The number of times the option expects to be included.
Definition Option.hpp:571
callback_t callback_
Options store a callback to do all the work.
Definition Option.hpp:313
CLI11_NODISCARD bool empty() const
True if the option was not passed.
Definition Option.hpp:367
CLI11_NODISCARD int get_expected_min() const
The number of times the option expects to be included.
Definition Option.hpp:574
void clear()
Clear the parsed results (mostly for testing)
Definition Option.hpp:373
CLI11_NODISCARD int get_expected_max() const
The max number of times the option expects to be included.
Definition Option.hpp:576
Option * capture_default_str()
Capture the default value from the original value (if it can be captured)
Definition Option.hpp:752
void results(T &output) const
Get the results as a specified type.
Definition Option.hpp:680
Option * default_str(std::string val)
Set the default value string representation (does not change the contained value)
Definition Option.hpp:760
CLI11_NODISCARD int get_type_size() const
The number of arguments the option expects.
Definition Option.hpp:524
std::string envname_
If given, check the environment for this option.
Definition Option.hpp:258
std::function< std::string()> default_function_
Run this function to capture a default (ignore if empty)
Definition Option.hpp:279
CLI11_NODISCARD bool get_allow_extra_args() const
Get the current value of allow extra args.
Definition Option.hpp:395
Option * ignore_underscore(bool value=true)
Definition Option_inl.hpp:199
std::vector< std::pair< std::string, std::string > > default_flag_values_
Definition Option.hpp:249
std::vector< Validator > validators_
A list of Validators to run on each value parsed.
Definition Option.hpp:297
Option * envname(std::string name)
Sets environment variable to read if no option given.
Definition Option.hpp:494
Option * type_name_fn(std::function< std::string()> typefun)
Set the type function to run when displayed on this option.
Definition Option.hpp:725
Option * default_val(const X &val)
Definition Option.hpp:767
Option * needs(Option *opt)
Sets required options.
Definition Option.hpp:447
int type_size_max_
Definition Option.hpp:287
Option * needs(A opt, B opt1, ARG... args)
Any number supported, any mix of string and Opt.
Definition Option.hpp:464
bool allow_extra_args_
Specify that extra args beyond type_size_max should be allowed.
Definition Option.hpp:333
Option * description(std::string option_description)
Set the description.
Definition Option.hpp:602
Option * transform(Validator Validator, const std::string &Validator_name="")
Adds a transforming Validator with a built in type name.
Definition Option_inl.hpp:92
std::vector< std::string > lnames_
A list of the long names (--long) without the leading dashes.
Definition Option.hpp:245
Option * force_callback(bool value=true)
Set the value of force_callback.
Definition Option.hpp:405
Option * add_result(std::string s)
Puts a result at the end.
Definition Option_inl.hpp:429
bool remove_needs(Option *opt)
Remove needs link from an option. Returns true if the option really was in the needs list.
Definition Option_inl.hpp:144
bool operator==(const Option &other) const
If options share any of the same names, they are equal (not counting positional)
Definition Option.hpp:637
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_inl.hpp:114
Option * needs(std::string opt_name)
Can find a string if needed.
Definition Option.hpp:455
CLI11_NODISCARD const std::vector< std::string > & get_fnames() const
Get the flag names with specified default values.
Definition Option.hpp:556
CLI11_NODISCARD bool has_description() const
True if option has description.
Definition Option.hpp:596
results_t results_
complete Results of parsing
Definition Option.hpp:320
CLI11_NODISCARD T as() const
Return the results as the specified type.
Definition Option.hpp:711
Option * excludes(A opt, B opt1, ARG... args)
Any number supported, any mix of string and Opt.
Definition Option.hpp:485
Some validators that are provided.
Definition Validators.hpp:55