CLI11 2.7.1
C++11 Command Line Interface Parser
Loading...
Searching...
No Matches
Option.hpp
1// Copyright (c) 2017-2026, 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>;
40using Validator_p = std::shared_ptr<Validator>;
41
43enum class MultiOptionPolicy : char {
44 Throw,
45 TakeLast,
46 TakeFirst,
47 Join,
48 TakeAll,
49 Sum,
50 Reverse,
51};
52
54enum class CallbackPriority : std::uint8_t {
55 FirstPreHelp = 0,
56 First = 1,
57 PreRequirementsCheckPreHelp = 2,
58 PreRequirementsCheck = 3,
59 NormalPreHelp = 4,
60 Normal = 5,
61 LastPreHelp = 6,
62 Last = 7
63}; // namespace CLI
64
67template <typename CRTP> class OptionBase {
68 friend App;
69 friend ConfigBase;
70
71 protected:
73 std::string group_ = std::string("OPTIONS");
74
76 bool required_{false};
77
79 bool ignore_case_{false};
80
82 bool ignore_underscore_{false};
83
85 bool configurable_{true};
86
89
91 char delimiter_{'\0'};
92
95
97 MultiOptionPolicy multi_option_policy_{MultiOptionPolicy::Throw};
98
100 CallbackPriority callback_priority_{CallbackPriority::Normal};
101
103 template <typename T> void copy_to(T *other) const;
104
105 public:
106 // setters
107
109 CRTP *group(const std::string &name) {
110 if(!detail::valid_alias_name_string(name)) {
111 throw IncorrectConstruction("Group names may not contain newlines or null characters");
112 }
113 group_ = name;
114 return static_cast<CRTP *>(this);
115 }
116
118 CRTP *required(bool value = true) {
119 required_ = value;
120 return static_cast<CRTP *>(this);
121 }
122
124 CRTP *mandatory(bool value = true) { return required(value); }
125
126 CRTP *always_capture_default(bool value = true) {
128 return static_cast<CRTP *>(this);
129 }
130
131 // Getters
132
134 CLI11_NODISCARD const std::string &get_group() const { return group_; }
135
137 CLI11_NODISCARD bool get_required() const { return required_; }
138
140 CLI11_NODISCARD bool get_ignore_case() const { return ignore_case_; }
141
143 CLI11_NODISCARD bool get_ignore_underscore() const { return ignore_underscore_; }
144
146 CLI11_NODISCARD bool get_configurable() const { return configurable_; }
147
149 CLI11_NODISCARD bool get_disable_flag_override() const { return disable_flag_override_; }
150
152 CLI11_NODISCARD char get_delimiter() const { return delimiter_; }
153
155 CLI11_NODISCARD bool get_always_capture_default() const { return always_capture_default_; }
156
158 CLI11_NODISCARD MultiOptionPolicy get_multi_option_policy() const { return multi_option_policy_; }
159
161 CLI11_NODISCARD CallbackPriority get_callback_priority() const { return callback_priority_; }
162
163 // Shortcuts for multi option policy
164
166 CRTP *take_last() {
167 auto *self = static_cast<CRTP *>(this);
168 self->multi_option_policy(MultiOptionPolicy::TakeLast);
169 return self;
170 }
171
173 CRTP *take_first() {
174 auto *self = static_cast<CRTP *>(this);
175 self->multi_option_policy(MultiOptionPolicy::TakeFirst);
176 return self;
177 }
178
180 CRTP *take_all() {
181 auto self = static_cast<CRTP *>(this);
182 self->multi_option_policy(MultiOptionPolicy::TakeAll);
183 return self;
184 }
185
187 CRTP *join() {
188 auto *self = static_cast<CRTP *>(this);
189 self->multi_option_policy(MultiOptionPolicy::Join);
190 return self;
191 }
192
194 CRTP *join(char delim) {
195 auto self = static_cast<CRTP *>(this);
196 self->delimiter_ = delim;
197 self->multi_option_policy(MultiOptionPolicy::Join);
198 return self;
199 }
200
202 CRTP *configurable(bool value = true) {
203 configurable_ = value;
204 return static_cast<CRTP *>(this);
205 }
206
208 CRTP *delimiter(char value = '\0') {
209 delimiter_ = value;
210 return static_cast<CRTP *>(this);
211 }
212};
213
216class OptionDefaults : public OptionBase<OptionDefaults> {
217 public:
218 OptionDefaults() = default;
219
220 // Methods here need a different implementation if they are Option vs. OptionDefault
221
223 OptionDefaults *callback_priority(CallbackPriority value = CallbackPriority::Normal) {
224 callback_priority_ = value;
225 return this;
226 }
227
229 OptionDefaults *multi_option_policy(MultiOptionPolicy value = MultiOptionPolicy::Throw) {
230 multi_option_policy_ = value;
231 return this;
232 }
233
235 OptionDefaults *ignore_case(bool value = true) {
236 ignore_case_ = value;
237 return this;
238 }
239
241 OptionDefaults *ignore_underscore(bool value = true) {
242 ignore_underscore_ = value;
243 return this;
244 }
245
247 OptionDefaults *disable_flag_override(bool value = true) {
249 return this;
250 }
251
253 OptionDefaults *delimiter(char value = '\0') {
254 delimiter_ = value;
255 return this;
256 }
257};
258
259class Option : public OptionBase<Option> {
260 friend App;
261 friend ConfigBase;
262
263 protected:
266
268 std::vector<std::string> snames_{};
269
271 std::vector<std::string> lnames_{};
272
275 std::vector<std::pair<std::string, std::string>> default_flag_values_{};
276
278 std::vector<std::string> fnames_{};
279
281 std::string pname_{};
282
284 std::string envname_{};
285
289
291 std::string description_{};
292
294 std::string default_str_{};
295
297 std::string option_text_{};
298
302 std::function<std::string()> type_name_{[]() { return std::string(); }};
303
305 std::function<std::string()> default_function_{};
306
310
316
321
323 std::vector<Validator_p> validators_{};
324
326 std::set<Option *> needs_{};
327
329 std::set<Option *> excludes_{};
330
334
336 App *parent_{nullptr};
337
339 callback_t callback_{};
340
344
346 results_t results_{};
348 mutable results_t proc_results_{};
350 enum class option_state : char {
355 };
356
359 bool allow_extra_args_{false};
361 bool flag_like_{false};
365 bool inject_separator_{false};
369 bool force_callback_{false};
370
372 Option(std::string option_name,
373 std::string option_description,
374 callback_t callback,
375 App *parent,
376 bool allow_non_standard = false);
377
378 public:
381
382 Option(const Option &) = delete;
383 Option &operator=(const Option &) = delete;
384
386 CLI11_NODISCARD std::size_t count() const { return results_.size(); }
387
389 CLI11_NODISCARD bool empty() const { return results_.empty(); }
390
392 explicit operator bool() const { return !empty() || force_callback_; }
393
395 void clear();
396
400
402 Option *expected(int value);
403
405 Option *expected(int value_min, int value_max);
406
409 Option *allow_extra_args(bool value = true) {
410 allow_extra_args_ = value;
411 return this;
412 }
413
414 CLI11_NODISCARD bool get_allow_extra_args() const { return allow_extra_args_; }
416 Option *trigger_on_parse(bool value = true) {
417 trigger_on_result_ = value;
418 return this;
419 }
420
421 CLI11_NODISCARD bool get_trigger_on_parse() const { return trigger_on_result_; }
422
424 Option *force_callback(bool value = true) {
425 force_callback_ = value;
426 return this;
427 }
428
429 CLI11_NODISCARD bool get_force_callback() const { return force_callback_; }
430
433 Option *run_callback_for_default(bool value = true) {
435 return this;
436 }
437
438 CLI11_NODISCARD bool get_run_callback_for_default() const { return run_callback_for_default_; }
439
442 Option *callback_priority(CallbackPriority value = CallbackPriority::Normal) {
443 callback_priority_ = value;
444 return this;
445 }
446
448 Option *check(Validator_p validator);
449
451 Option *check(Validator validator, const std::string &validator_name = "");
452
454 Option *check(std::function<std::string(const std::string &)> validator_func,
455 std::string validator_description = "",
456 std::string validator_name = "");
457
459 Option *transform(Validator_p validator);
460
462 Option *transform(Validator validator, const std::string &transform_name = "");
463
465 Option *transform(Validator validator, const std::string &transform_description, const std::string &transform_name);
466
468 Option *transform(const std::function<std::string(std::string)> &transform_func,
469 std::string transform_description = "",
470 std::string transform_name = "");
471
473 Option *each(const std::function<void(std::string)> &func);
474
476 Validator *get_validator(const std::string &validator_name = "");
477
479 Validator *get_validator(int index);
480
482 Option *needs(Option *opt);
483
485 template <typename T = App> Option *needs(std::string opt_name) {
486 auto opt = static_cast<T *>(parent_)->get_option_no_throw(opt_name);
487 if(opt == nullptr) {
488 throw IncorrectConstruction::MissingOption(opt_name);
489 }
490 return needs(opt);
491 }
492
494 template <typename A, typename B, typename... ARG> Option *needs(A opt, B opt1, ARG... args) {
495 needs(opt);
496 return needs(opt1, args...); // NOLINT(readability-suspicious-call-argument)
497 }
498
500 bool remove_needs(Option *opt);
501
503 Option *excludes(Option *opt);
504
506 template <typename T = App> Option *excludes(std::string opt_name) {
507 auto opt = static_cast<T *>(parent_)->get_option_no_throw(opt_name);
508 if(opt == nullptr) {
509 throw IncorrectConstruction::MissingOption(opt_name);
510 }
511 return excludes(opt);
512 }
513
515 template <typename A, typename B, typename... ARG> Option *excludes(A opt, B opt1, ARG... args) {
516 excludes(opt);
517 return excludes(opt1, args...);
518 }
519
521 bool remove_excludes(Option *opt);
522
524 Option *envname(std::string name) {
525 envname_ = std::move(name);
526 return this;
527 }
528
533 template <typename T = App> Option *ignore_case(bool value = true);
534
539 template <typename T = App> Option *ignore_underscore(bool value = true);
540
542 Option *multi_option_policy(MultiOptionPolicy value = MultiOptionPolicy::Throw);
543
545 Option *disable_flag_override(bool value = true) {
547 return this;
548 }
549
552
554 CLI11_NODISCARD int get_type_size() const { return type_size_min_; }
555
557 CLI11_NODISCARD int get_type_size_min() const { return type_size_min_; }
559 CLI11_NODISCARD int get_type_size_max() const { return type_size_max_; }
560
562 CLI11_NODISCARD bool get_inject_separator() const { return inject_separator_; }
563
565 CLI11_NODISCARD std::string get_envname() const { return envname_; }
566
568 CLI11_NODISCARD std::set<Option *> get_needs() const { return needs_; }
569
571 CLI11_NODISCARD std::set<Option *> get_excludes() const { return excludes_; }
572
574 CLI11_NODISCARD std::string get_default_str() const { return default_str_; }
575
577 CLI11_NODISCARD callback_t get_callback() const { return callback_; }
578
580 CLI11_NODISCARD const std::vector<std::string> &get_lnames() const { return lnames_; }
581
583 CLI11_NODISCARD const std::vector<std::string> &get_snames() const { return snames_; }
584
586 CLI11_NODISCARD const std::vector<std::string> &get_fnames() const { return fnames_; }
588 CLI11_NODISCARD const std::string &get_single_name() const;
590 CLI11_NODISCARD int get_expected() const { return expected_min_; }
591
593 CLI11_NODISCARD int get_expected_min() const { return expected_min_; }
595 CLI11_NODISCARD int get_expected_max() const { return expected_max_; }
596
598 CLI11_NODISCARD int get_items_expected_min() const { return type_size_min_ * expected_min_; }
599
601 CLI11_NODISCARD int get_items_expected_max() const {
602 int t = type_size_max_;
603 return detail::checked_multiply(t, expected_max_) ? t : detail::expected_max_vector_size;
604 }
605
606 CLI11_NODISCARD int get_items_expected() const { return get_items_expected_min(); }
607
609 CLI11_NODISCARD bool get_positional() const { return !pname_.empty(); }
610
612 CLI11_NODISCARD bool nonpositional() const { return (!lnames_.empty() || !snames_.empty()); }
613
615 CLI11_NODISCARD bool has_description() const { return !description_.empty(); }
616
618 CLI11_NODISCARD const std::string &get_description() const { return description_; }
619
621 Option *description(std::string option_description) {
622 description_ = std::move(option_description);
623 return this;
624 }
625
626 Option *option_text(std::string text) {
627 option_text_ = std::move(text);
628 return this;
629 }
630
631 CLI11_NODISCARD const std::string &get_option_text() const { return option_text_; }
632
636
642 CLI11_NODISCARD std::string get_name(bool positional = false,
643 bool all_options = false,
644 bool disable_default_flag_values = false
645 ) const;
646
650
652 void run_callback();
653
655 CLI11_NODISCARD const std::string &matching_name(const Option &other) const;
656
658 bool operator==(const Option &other) const { return !matching_name(other).empty(); }
659
661 CLI11_NODISCARD bool check_name(const std::string &name) const;
662
664 CLI11_NODISCARD bool check_sname(std::string name) const {
665 return (detail::find_member(std::move(name), snames_, ignore_case_) >= 0);
666 }
667
669 CLI11_NODISCARD bool check_lname(std::string name) const {
670 return (detail::find_member(std::move(name), lnames_, ignore_case_, ignore_underscore_) >= 0);
671 }
672
674 CLI11_NODISCARD bool check_fname(std::string name) const {
675 if(fnames_.empty()) {
676 return false;
677 }
678 return (detail::find_member(std::move(name), fnames_, ignore_case_, ignore_underscore_) >= 0);
679 }
680
683 CLI11_NODISCARD std::string get_flag_value(const std::string &name, std::string input_value) const;
684
686 Option *add_result(std::string s);
687
689 Option *add_result(std::string s, int &results_added);
690
692 Option *add_result(std::vector<std::string> s);
693
695 CLI11_NODISCARD const results_t &results() const { return results_; }
696
698 CLI11_NODISCARD results_t reduced_results() const;
699
701 template <typename T> void results(T &output) const {
702 bool retval = false;
703 if(current_option_state_ >= option_state::reduced || (results_.size() == 1 && validators_.empty())) {
704 const results_t &res = (proc_results_.empty()) ? results_ : proc_results_;
705 if(!res.empty()) {
706 retval = detail::lexical_conversion<T, T>(res, output);
707 } else {
708 results_t res2;
709 res2.emplace_back();
710 proc_results_ = std::move(res2);
711 retval = detail::lexical_conversion<T, T>(proc_results_, output);
712 }
713
714 } else {
715 results_t res;
716 if(results_.empty()) {
717 if(!default_str_.empty()) {
718 // _add_results takes an rvalue only
719 _add_result(std::string(default_str_), res);
720 _validate_results(res);
721 results_t extra;
722 _reduce_results(extra, res);
723 if(!extra.empty()) {
724 res = std::move(extra);
725 }
726 } else {
727 res.emplace_back();
728 }
729 } else {
730 res = reduced_results();
731 }
732 // store the results in a stable location if the output is a view
733 proc_results_ = std::move(res);
734 retval = detail::lexical_conversion<T, T>(proc_results_, output);
735 }
736 if(!retval) {
738 }
739 }
740
742 template <typename T> CLI11_NODISCARD T as() const {
743 T output;
744 results(output);
745 return output;
746 }
747
749 CLI11_NODISCARD bool get_callback_run() const { return (current_option_state_ == option_state::callback_run); }
750
754
756 Option *type_name_fn(std::function<std::string()> typefun) {
757 type_name_ = std::move(typefun);
758 return this;
759 }
760
762 Option *type_name(std::string typeval);
763
765 Option *type_size(int option_type_size);
766
768 Option *type_size(int option_type_size_min, int option_type_size_max);
769
771 void inject_separator(bool value = true) { inject_separator_ = value; }
772
774 Option *default_function(const std::function<std::string()> &func) {
775 default_function_ = func;
776 return this;
777 }
778
781
783 Option *default_str(std::string val) {
784 default_str_ = std::move(val);
785 return this;
786 }
787
790 template <typename X> Option *default_val(const X &val) {
791 std::string val_str = detail::value_string(val);
792 auto old_option_state = current_option_state_;
793 results_t old_results{std::move(results_)};
794 results_.clear();
795 try {
796 add_result(val_str);
797 // if trigger_on_result_ is set the callback already ran
799 run_callback(); // run callback sets the state, we need to reset it again
801 } else {
802 _validate_results(results_);
803 current_option_state_ = old_option_state;
804 }
805 } catch(const ConversionError &err) {
806 // this should be done
807 results_ = std::move(old_results);
808 current_option_state_ = old_option_state;
809
810 throw ConversionError(
811 get_name(), std::string("given default value(\"") + val_str + "\") produces an error : " + err.what());
812 } catch(const CLI::Error &) {
813 results_ = std::move(old_results);
814 current_option_state_ = old_option_state;
815 throw;
816 }
817 results_ = std::move(old_results);
818 default_str_ = std::move(val_str);
819 return this;
820 }
821
823 CLI11_NODISCARD std::string get_type_name() const;
824
825 private:
827 void _validate_results(results_t &res) const;
828
832 void _reduce_results(results_t &out, const results_t &original) const;
833
834 // Run a result through the Validators
835 std::string _validate(std::string &result, int index) const;
836
838 int _add_result(std::string &&result, std::vector<std::string> &res) const;
839};
840
841// [CLI11:option_hpp:end]
842} // namespace CLI
843
844#ifndef CLI11_COMPILE
845#include "impl/Option_inl.hpp" // IWYU pragma: export
846#endif
Creates a command line program, with very few defaults.
Definition App.hpp:114
This converter works with INI/TOML files; to write INI files use ConfigINI.
Definition ConfigFwd.hpp:73
Thrown when conversion call back fails, such as when an int fails to coerce to a string.
Definition Error.hpp:206
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:97
Definition Option.hpp:67
CRTP * mandatory(bool value=true)
Support Plumbum term.
Definition Option.hpp:124
CRTP * take_all()
Set the multi option policy to take all arguments.
Definition Option.hpp:180
CRTP * group(const std::string &name)
Changes the group membership.
Definition Option.hpp:109
CRTP * join()
Set the multi option policy to join.
Definition Option.hpp:187
bool always_capture_default_
Automatically capture default value.
Definition Option.hpp:94
MultiOptionPolicy multi_option_policy_
Policy for handling multiple arguments beyond the expected Max.
Definition Option.hpp:97
CRTP * join(char delim)
Set the multi option policy to join with a specific delimiter.
Definition Option.hpp:194
CLI11_NODISCARD CallbackPriority get_callback_priority() const
The priority of callback.
Definition Option.hpp:161
CLI11_NODISCARD bool get_always_capture_default() const
Return true if this will automatically capture the default value for help printing.
Definition Option.hpp:155
CLI11_NODISCARD char get_delimiter() const
Get the current delimiter char.
Definition Option.hpp:152
CLI11_NODISCARD bool get_required() const
True if this is a required option.
Definition Option.hpp:137
CRTP * take_first()
Set the multi option policy to take last.
Definition Option.hpp:173
CLI11_NODISCARD bool get_ignore_case() const
The status of ignore case.
Definition Option.hpp:140
bool ignore_case_
Ignore the case when matching (option, not value).
Definition Option.hpp:79
CRTP * configurable(bool value=true)
Allow in a configuration file.
Definition Option.hpp:202
CRTP * delimiter(char value='\0')
Allow in a configuration file.
Definition Option.hpp:208
CLI11_NODISCARD MultiOptionPolicy get_multi_option_policy() const
The status of the multi option policy.
Definition Option.hpp:158
CLI11_NODISCARD bool get_configurable() const
The status of configurable.
Definition Option.hpp:146
bool configurable_
Allow this option to be given in a configuration file.
Definition Option.hpp:85
CallbackPriority callback_priority_
Priority of callback.
Definition Option.hpp:100
bool disable_flag_override_
Disable overriding flag values with '=value'.
Definition Option.hpp:88
bool required_
True if this is a required option.
Definition Option.hpp:76
CRTP * take_last()
Set the multi option policy to take last.
Definition Option.hpp:166
char delimiter_
Specify a delimiter character for vector arguments.
Definition Option.hpp:91
std::string group_
The group membership.
Definition Option.hpp:73
CLI11_NODISCARD bool get_ignore_underscore() const
The status of ignore_underscore.
Definition Option.hpp:143
bool ignore_underscore_
Ignore underscores when matching (option, not value).
Definition Option.hpp:82
CLI11_NODISCARD bool get_disable_flag_override() const
The status of configurable.
Definition Option.hpp:149
CLI11_NODISCARD const std::string & get_group() const
Get the group of this option.
Definition Option.hpp:134
void copy_to(T *other) const
Copy the contents to another similar class (one based on OptionBase).
Definition Option_inl.hpp:27
CRTP * required(bool value=true)
Set the option as required.
Definition Option.hpp:118
OptionDefaults * multi_option_policy(MultiOptionPolicy value=MultiOptionPolicy::Throw)
Take the last argument if given multiple times.
Definition Option.hpp:229
OptionDefaults * ignore_case(bool value=true)
Ignore the case of the option name.
Definition Option.hpp:235
OptionDefaults * ignore_underscore(bool value=true)
Ignore underscores in the option name.
Definition Option.hpp:241
OptionDefaults * callback_priority(CallbackPriority value=CallbackPriority::Normal)
Set the callback priority.
Definition Option.hpp:223
OptionDefaults * delimiter(char value='\0')
set a delimiter character to split up single arguments to treat as multiple inputs
Definition Option.hpp:253
OptionDefaults * disable_flag_override(bool value=true)
Disable overriding flag values with an '=' segment.
Definition Option.hpp:247
Definition Option.hpp:259
Option * type_size(int option_type_size)
Set a custom option size.
Definition Option_inl.hpp:527
Option * expected(int value)
Set the number of expected arguments.
Definition Option_inl.hpp:52
Option * check(Validator_p validator)
Adds a shared validator.
Definition Option_inl.hpp:92
CLI11_NODISCARD bool get_positional() const
True if the argument can be given directly.
Definition Option.hpp:609
std::string default_str_
A human readable default value, either manually set, captured, or captured by default.
Definition Option.hpp:294
bool run_callback_for_default_
Control option to run the callback to set the default.
Definition Option.hpp:363
CLI11_NODISCARD std::string get_envname() const
The environment variable associated to this value.
Definition Option.hpp:565
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:414
std::function< std::string()> type_name_
Definition Option.hpp:302
option_state
enumeration for the option state machine
Definition Option.hpp:350
@ reduced
a subset of results has been generated
Definition Option.hpp:353
@ callback_run
the callback has been executed
Definition Option.hpp:354
@ validated
the results have been validated
Definition Option.hpp:352
@ parsing
The option is currently collecting parsed results.
Definition Option.hpp:351
option_state current_option_state_
Whether the callback has run (needed for INI parsing).
Definition Option.hpp:357
std::string option_text_
If given, replace the text that describes the option type and usage in the help text.
Definition Option.hpp:297
int type_size_min_
The minimum number of arguments an option should be expecting.
Definition Option.hpp:315
Option * callback_priority(CallbackPriority value=CallbackPriority::Normal)
Definition Option.hpp:442
CLI11_NODISCARD results_t reduced_results() const
Get a copy of the results.
Definition Option_inl.hpp:509
void clear()
Clear the parsed results (mostly for testing).
Definition Option_inl.hpp:46
Option * capture_default_str()
Capture the default value from the original value (if it can be captured).
Definition Option_inl.hpp:588
Option * needs(Option *opt)
Sets required options.
Definition Option_inl.hpp:193
CLI11_NODISCARD std::string get_type_name() const
Get the full typename for this option.
Definition Option_inl.hpp:595
CLI11_NODISCARD bool check_fname(std::string name) const
Requires "--" to be removed from string.
Definition Option.hpp:674
std::string pname_
A positional name.
Definition Option.hpp:281
int expected_min_
The minimum number of expected values.
Definition Option.hpp:318
Option * transform(Validator_p validator)
Adds a shared Validator.
Definition Option_inl.hpp:121
Option * ignore_case(bool value=true)
Definition Option_inl.hpp:235
std::set< Option * > needs_
A list of options that are required with this option.
Definition Option.hpp:326
Option * default_function(const std::function< std::string()> &func)
Set a capture function for the default. Mostly used by App.
Definition Option.hpp:774
CLI11_NODISCARD int get_type_size_min() const
The minimum number of arguments the option expects.
Definition Option.hpp:557
void run_callback()
Process the callback.
Definition Option_inl.hpp:343
CLI11_NODISCARD std::string get_name(bool positional=false, bool all_options=false, bool disable_default_flag_values=false) const
Gets a comma separated list of names. Will include / prefer the positional name if positional is true...
Definition Option_inl.hpp:290
CLI11_NODISCARD bool check_sname(std::string name) const
Requires "-" to be removed from string.
Definition Option.hpp:664
bool trigger_on_result_
flag indicating that the option should trigger the validation and callback chain on each result when ...
Definition Option.hpp:367
bool flag_like_
Specify that the option should act like a flag vs regular option.
Definition Option.hpp:361
std::set< Option * > excludes_
A list of options that are excluded with this option.
Definition Option.hpp:329
bool force_callback_
flag indicating that the option should force the callback regardless if any results present
Definition Option.hpp:369
CLI11_NODISCARD bool get_callback_run() const
See if the callback has been run already.
Definition Option.hpp:749
CLI11_NODISCARD bool get_force_callback() const
The status of force_callback.
Definition Option.hpp:429
std::vector< std::string > fnames_
a list of flag names with specified default values;
Definition Option.hpp:278
CLI11_NODISCARD bool get_run_callback_for_default() const
Get the current value of run_callback_for_default.
Definition Option.hpp:438
CLI11_NODISCARD std::string get_default_str() const
The default value (for help printing).
Definition Option.hpp:574
CLI11_NODISCARD bool nonpositional() const
True if option has at least one non-positional name.
Definition Option.hpp:612
CLI11_NODISCARD int get_items_expected_min() const
The total min number of expected string values to be used.
Definition Option.hpp:598
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:376
CLI11_NODISCARD bool check_lname(std::string name) const
Requires "--" to be removed from string.
Definition Option.hpp:669
CLI11_NODISCARD const results_t & results() const
Get the current complete results set.
Definition Option.hpp:695
Option * disable_flag_override(bool value=true)
Disable flag overrides values, e.g. –flag=is not allowed.
Definition Option.hpp:545
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:601
std::vector< std::string > snames_
A list of the short names (-a) without the leading dashes.
Definition Option.hpp:268
results_t proc_results_
results after reduction
Definition Option.hpp:348
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:225
CLI11_NODISCARD std::size_t count() const
Count the total number of times an option was passed.
Definition Option.hpp:386
Option * run_callback_for_default(bool value=true)
Definition Option.hpp:433
void inject_separator(bool value=true)
Set the value of the separator injection flag.
Definition Option.hpp:771
Option * allow_extra_args(bool value=true)
Definition Option.hpp:409
Option * multi_option_policy(MultiOptionPolicy value=MultiOptionPolicy::Throw)
Take the last argument if given multiple times (or another policy).
Definition Option_inl.hpp:276
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:416
CLI11_NODISCARD callback_t get_callback() const
Get the callback function.
Definition Option.hpp:577
CLI11_NODISCARD bool get_inject_separator() const
Return the inject_separator flag.
Definition Option.hpp:562
std::vector< Validator_p > validators_
A list of Validators to run on each value parsed.
Definition Option.hpp:323
CLI11_NODISCARD const std::string & get_single_name() const
Get a single name for the option, first of lname, sname, pname, envname.
Definition Option_inl.hpp:570
Option * excludes(Option *opt)
Sets excluded options.
Definition Option_inl.hpp:210
App * parent_
link back up to the parent App for fallthrough
Definition Option.hpp:336
CLI11_NODISCARD bool get_trigger_on_parse() const
The status of trigger on parse.
Definition Option.hpp:421
CLI11_NODISCARD const std::vector< std::string > & get_lnames() const
Get the long names.
Definition Option.hpp:580
int expected_max_
The maximum number of expected values.
Definition Option.hpp:320
CLI11_NODISCARD std::set< Option * > get_excludes() const
The set of options excluded.
Definition Option.hpp:571
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_inl.hpp:40
CLI11_NODISCARD std::string get_flag_value(const std::string &name, std::string input_value) const
Definition Option_inl.hpp:443
Option * excludes(std::string opt_name)
Can find a string if needed.
Definition Option.hpp:506
CLI11_NODISCARD int get_items_expected() const
The total min number of expected string values to be used.
Definition Option.hpp:606
CLI11_NODISCARD std::set< Option * > get_needs() const
The set of options needed.
Definition Option.hpp:568
std::string description_
The description for help strings.
Definition Option.hpp:291
CLI11_NODISCARD const std::vector< std::string > & get_snames() const
Get the short names.
Definition Option.hpp:583
CLI11_NODISCARD int get_type_size_max() const
The maximum number of arguments the option expects.
Definition Option.hpp:559
bool inject_separator_
flag indicating a separator needs to be injected after each argument call
Definition Option.hpp:365
CLI11_NODISCARD const std::string & get_description() const
Get the description.
Definition Option.hpp:618
Validator * get_validator(const std::string &validator_name="")
Get a named Validator.
Definition Option_inl.hpp:173
CLI11_NODISCARD int get_expected() const
The number of times the option expects to be included.
Definition Option.hpp:590
callback_t callback_
Options store a callback to do all the work.
Definition Option.hpp:339
CLI11_NODISCARD bool empty() const
True if the option was not passed.
Definition Option.hpp:389
CLI11_NODISCARD int get_expected_min() const
The number of times the option expects to be included.
Definition Option.hpp:593
CLI11_NODISCARD int get_expected_max() const
The max number of times the option expects to be included.
Definition Option.hpp:595
void results(T &output) const
Get the results as a specified type.
Definition Option.hpp:701
Option * default_str(std::string val)
Set the default value string representation (does not change the contained value).
Definition Option.hpp:783
CLI11_NODISCARD int get_type_size() const
The number of arguments the option expects.
Definition Option.hpp:554
std::string envname_
If given, check the environment for this option.
Definition Option.hpp:284
std::function< std::string()> default_function_
Run this function to capture a default (ignore if empty).
Definition Option.hpp:305
CLI11_NODISCARD bool get_allow_extra_args() const
Get the current value of allow extra args.
Definition Option.hpp:414
Option * ignore_underscore(bool value=true)
Definition Option_inl.hpp:255
std::vector< std::pair< std::string, std::string > > default_flag_values_
Definition Option.hpp:275
Option * envname(std::string name)
Sets environment variable to read if no option given.
Definition Option.hpp:524
Option * type_name_fn(std::function< std::string()> typefun)
Set the type function to run when displayed on this option.
Definition Option.hpp:756
Option * default_val(const X &val)
Definition Option.hpp:790
int type_size_max_
Definition Option.hpp:313
Option * needs(A opt, B opt1, ARG... args)
Any number supported, any mix of string and Opt.
Definition Option.hpp:494
bool allow_extra_args_
Specify that extra args beyond type_size_max should be allowed.
Definition Option.hpp:359
Option * description(std::string option_description)
Set the description.
Definition Option.hpp:621
std::vector< std::string > lnames_
A list of the long names (--long) without the leading dashes.
Definition Option.hpp:271
Option * force_callback(bool value=true)
Set the value of force_callback.
Definition Option.hpp:424
Option * type_name(std::string typeval)
Set a custom option typestring.
Definition Option_inl.hpp:583
Option * add_result(std::string s)
Puts a result at the end.
Definition Option_inl.hpp:489
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:200
bool operator==(const Option &other) const
If options share any of the same names, they are equal (not counting positional).
Definition Option.hpp:658
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:162
Option * needs(std::string opt_name)
Can find a string if needed.
Definition Option.hpp:485
CLI11_NODISCARD const std::vector< std::string > & get_fnames() const
Get the flag names with specified default values.
Definition Option.hpp:586
CLI11_NODISCARD bool has_description() const
True if option has description.
Definition Option.hpp:615
results_t results_
complete Results of parsing
Definition Option.hpp:346
CLI11_NODISCARD T as() const
Return the results as the specified type.
Definition Option.hpp:742
Option * excludes(A opt, B opt1, ARG... args)
Any number supported, any mix of string and Opt.
Definition Option.hpp:515
Some validators that are provided.
Definition Validators.hpp:54