CLI11  2.6.2
Option.hpp
Go to the documentation of this file.
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 
28 namespace CLI {
29 // [CLI11:option_hpp:verbatim]
30 
31 using results_t = std::vector<std::string>;
33 using callback_t = std::function<bool(const results_t &)>;
34 
35 class Option;
36 class App;
37 class ConfigBase;
38 
39 using Option_p = std::unique_ptr<Option>;
40 using Validator_p = std::shared_ptr<Validator>;
41 
43 enum class MultiOptionPolicy : char {
44  Throw,
45  TakeLast,
46  TakeFirst,
47  Join,
48  TakeAll,
49  Sum,
50  Reverse,
51 };
52 
54 enum class CallbackPriority : std::uint8_t {
55  FirstPreHelp = 0,
56  First = 1,
59  NormalPreHelp = 4,
60  Normal = 5,
61  LastPreHelp = 6,
62  Last = 7
63 }; // namespace CLI
64 
67 template <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 
98 
101 
103  template <typename T> void copy_to(T *other) const;
104 
105  public:
106  // setters
107 
109  CRTP *group(const std::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) {
127  always_capture_default_ = value;
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 
141 
144 
147 
150 
152  CLI11_NODISCARD char get_delimiter() const { return delimiter_; }
153 
156 
159 
162 
163  // Shortcuts for multi option policy
164 
166  CRTP *take_last() {
167  auto *self = static_cast<CRTP *>(this);
169  return self;
170  }
171 
173  CRTP *take_first() {
174  auto *self = static_cast<CRTP *>(this);
176  return self;
177  }
178 
180  CRTP *take_all() {
181  auto self = static_cast<CRTP *>(this);
183  return self;
184  }
185 
187  CRTP *join() {
188  auto *self = static_cast<CRTP *>(this);
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 
216 class OptionDefaults : public OptionBase<OptionDefaults> {
217  public:
218  OptionDefaults() = default;
219 
220  // Methods here need a different implementation if they are Option vs. OptionDefault
221 
224  callback_priority_ = value;
225  return this;
226  }
227 
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) {
248  disable_flag_override_ = value;
249  return this;
250  }
251 
253  OptionDefaults *delimiter(char value = '\0') {
254  delimiter_ = value;
255  return this;
256  }
257 };
258 
259 class 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 
340 
344 
350  enum class option_state : char {
351  parsing = 0,
352  validated = 2,
353  reduced = 4,
354  callback_run = 6,
355  };
359  bool allow_extra_args_{false};
361  bool flag_like_{false};
365  bool inject_separator_{false};
367  bool trigger_on_result_{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  : description_(std::move(option_description)), parent_(parent), callback_(std::move(callback)) {
378  std::tie(snames_, lnames_, pname_) = detail::get_names(detail::split_names(option_name), allow_non_standard);
379  }
380 
381  public:
384 
385  Option(const Option &) = delete;
386  Option &operator=(const Option &) = delete;
387 
389  CLI11_NODISCARD std::size_t count() const { return results_.size(); }
390 
392  CLI11_NODISCARD bool empty() const { return results_.empty(); }
393 
395  explicit operator bool() const { return !empty() || force_callback_; }
396 
398  void clear() {
399  results_.clear();
401  }
402 
406 
408  Option *expected(int value);
409 
411  Option *expected(int value_min, int value_max);
412 
415  Option *allow_extra_args(bool value = true) {
416  allow_extra_args_ = value;
417  return this;
418  }
422  Option *trigger_on_parse(bool value = true) {
423  trigger_on_result_ = value;
424  return this;
425  }
428 
430  Option *force_callback(bool value = true) {
431  force_callback_ = value;
432  return this;
433  }
436 
439  Option *run_callback_for_default(bool value = true) {
441  return this;
442  }
445 
449  callback_priority_ = value;
450  return this;
451  }
452 
454  Option *check(Validator_p validator);
455 
457  Option *check(Validator validator, const std::string &validator_name = "");
458 
460  Option *check(std::function<std::string(const std::string &)> validator_func,
461  std::string validator_description = "",
462  std::string validator_name = "");
463 
465  Option *transform(Validator_p validator);
466 
468  Option *transform(Validator validator, const std::string &transform_name = "");
469 
471  Option *transform(const std::function<std::string(std::string)> &transform_func,
472  std::string transform_description = "",
473  std::string transform_name = "");
474 
476  Option *each(const std::function<void(std::string)> &func);
477 
479  Validator *get_validator(const std::string &validator_name = "");
480 
482  Validator *get_validator(int index);
483 
485  Option *needs(Option *opt) {
486  if(opt != this) {
487  needs_.insert(opt);
488  }
489  return this;
490  }
491 
493  template <typename T = App> Option *needs(std::string opt_name) {
494  auto opt = static_cast<T *>(parent_)->get_option_no_throw(opt_name);
495  if(opt == nullptr) {
496  throw IncorrectConstruction::MissingOption(opt_name);
497  }
498  return needs(opt);
499  }
500 
502  template <typename A, typename B, typename... ARG> Option *needs(A opt, B opt1, ARG... args) {
503  needs(opt);
504  return needs(opt1, args...); // NOLINT(readability-suspicious-call-argument)
505  }
506 
508  bool remove_needs(Option *opt);
509 
511  Option *excludes(Option *opt);
512 
514  template <typename T = App> Option *excludes(std::string opt_name) {
515  auto opt = static_cast<T *>(parent_)->get_option_no_throw(opt_name);
516  if(opt == nullptr) {
517  throw IncorrectConstruction::MissingOption(opt_name);
518  }
519  return excludes(opt);
520  }
521 
523  template <typename A, typename B, typename... ARG> Option *excludes(A opt, B opt1, ARG... args) {
524  excludes(opt);
525  return excludes(opt1, args...);
526  }
527 
529  bool remove_excludes(Option *opt);
530 
532  Option *envname(std::string name) {
533  envname_ = std::move(name);
534  return this;
535  }
536 
541  template <typename T = App> Option *ignore_case(bool value = true);
542 
547  template <typename T = App> Option *ignore_underscore(bool value = true);
548 
551 
553  Option *disable_flag_override(bool value = true) {
554  disable_flag_override_ = value;
555  return this;
556  }
560 
563 
568 
571 
573  CLI11_NODISCARD std::string get_envname() const { return envname_; }
574 
576  CLI11_NODISCARD std::set<Option *> get_needs() const { return needs_; }
577 
579  CLI11_NODISCARD std::set<Option *> get_excludes() const { return excludes_; }
580 
582  CLI11_NODISCARD std::string get_default_str() const { return default_str_; }
583 
586 
588  CLI11_NODISCARD const std::vector<std::string> &get_lnames() const { return lnames_; }
589 
591  CLI11_NODISCARD const std::vector<std::string> &get_snames() const { return snames_; }
592 
594  CLI11_NODISCARD const std::vector<std::string> &get_fnames() const { return fnames_; }
596  CLI11_NODISCARD const std::string &get_single_name() const {
597  if(!lnames_.empty()) {
598  return lnames_[0];
599  }
600  if(!snames_.empty()) {
601  return snames_[0];
602  }
603  if(!pname_.empty()) {
604  return pname_;
605  }
606  return envname_;
607  }
610 
615 
618 
621  int t = type_size_max_;
623  }
626 
628  CLI11_NODISCARD bool get_positional() const { return !pname_.empty(); }
629 
631  CLI11_NODISCARD bool nonpositional() const { return (!lnames_.empty() || !snames_.empty()); }
632 
634  CLI11_NODISCARD bool has_description() const { return !description_.empty(); }
635 
637  CLI11_NODISCARD const std::string &get_description() const { return description_; }
638 
640  Option *description(std::string option_description) {
641  description_ = std::move(option_description);
642  return this;
643  }
644 
645  Option *option_text(std::string text) {
646  option_text_ = std::move(text);
647  return this;
648  }
649 
650  CLI11_NODISCARD const std::string &get_option_text() const { return option_text_; }
651 
655 
661  CLI11_NODISCARD std::string get_name(bool positional = false,
662  bool all_options = false,
663  bool disable_default_flag_values = false
664  ) const;
665 
669 
671  void run_callback();
672 
674  CLI11_NODISCARD const std::string &matching_name(const Option &other) const;
675 
677  bool operator==(const Option &other) const { return !matching_name(other).empty(); }
678 
680  CLI11_NODISCARD bool check_name(const std::string &name) const;
681 
683  CLI11_NODISCARD bool check_sname(std::string name) const {
684  return (detail::find_member(std::move(name), snames_, ignore_case_) >= 0);
685  }
686 
688  CLI11_NODISCARD bool check_lname(std::string name) const {
689  return (detail::find_member(std::move(name), lnames_, ignore_case_, ignore_underscore_) >= 0);
690  }
691 
693  CLI11_NODISCARD bool check_fname(std::string name) const {
694  if(fnames_.empty()) {
695  return false;
696  }
697  return (detail::find_member(std::move(name), fnames_, ignore_case_, ignore_underscore_) >= 0);
698  }
699 
702  CLI11_NODISCARD std::string get_flag_value(const std::string &name, std::string input_value) const;
703 
705  Option *add_result(std::string s);
706 
708  Option *add_result(std::string s, int &results_added);
709 
711  Option *add_result(std::vector<std::string> s);
712 
714  CLI11_NODISCARD const results_t &results() const { return results_; }
715 
718 
720  template <typename T> void results(T &output) const {
721  bool retval = false;
722  if(current_option_state_ >= option_state::reduced || (results_.size() == 1 && validators_.empty())) {
723  const results_t &res = (proc_results_.empty()) ? results_ : proc_results_;
724  if(!res.empty()) {
725  retval = detail::lexical_conversion<T, T>(res, output);
726  } else {
727  results_t res2;
728  res2.emplace_back();
729  proc_results_ = std::move(res2);
730  retval = detail::lexical_conversion<T, T>(proc_results_, output);
731  }
732 
733  } else {
734  results_t res;
735  if(results_.empty()) {
736  if(!default_str_.empty()) {
737  // _add_results takes an rvalue only
738  _add_result(std::string(default_str_), res);
739  _validate_results(res);
740  results_t extra;
741  _reduce_results(extra, res);
742  if(!extra.empty()) {
743  res = std::move(extra);
744  }
745  } else {
746  res.emplace_back();
747  }
748  } else {
749  res = reduced_results();
750  }
751  // store the results in a stable location if the output is a view
752  proc_results_ = std::move(res);
753  retval = detail::lexical_conversion<T, T>(proc_results_, output);
754  }
755  if(!retval) {
757  }
758  }
759 
761  template <typename T> CLI11_NODISCARD T as() const {
762  T output;
763  results(output);
764  return output;
765  }
766 
769 
773 
775  Option *type_name_fn(std::function<std::string()> typefun) {
776  type_name_ = std::move(typefun);
777  return this;
778  }
779 
781  Option *type_name(std::string typeval) {
782  type_name_fn([typeval]() { return typeval; });
783  return this;
784  }
785 
787  Option *type_size(int option_type_size);
788 
790  Option *type_size(int option_type_size_min, int option_type_size_max);
791 
793  void inject_separator(bool value = true) { inject_separator_ = value; }
794 
796  Option *default_function(const std::function<std::string()> &func) {
797  default_function_ = func;
798  return this;
799  }
800 
803  if(default_function_) {
805  }
806  return this;
807  }
808 
810  Option *default_str(std::string val) {
811  default_str_ = std::move(val);
812  return this;
813  }
814 
817  template <typename X> Option *default_val(const X &val) {
818  std::string val_str = detail::value_string(val);
819  auto old_option_state = current_option_state_;
820  results_t old_results{std::move(results_)};
821  results_.clear();
822  try {
823  add_result(val_str);
824  // if trigger_on_result_ is set the callback already ran
826  run_callback(); // run callback sets the state, we need to reset it again
828  } else {
829  _validate_results(results_);
830  current_option_state_ = old_option_state;
831  }
832  } catch(const ConversionError &err) {
833  // this should be done
834  results_ = std::move(old_results);
835  current_option_state_ = old_option_state;
836 
837  throw ConversionError(
838  get_name(), std::string("given default value(\"") + val_str + "\") produces an error : " + err.what());
839  } catch(const CLI::Error &) {
840  results_ = std::move(old_results);
841  current_option_state_ = old_option_state;
842  throw;
843  }
844  results_ = std::move(old_results);
845  default_str_ = std::move(val_str);
846  return this;
847  }
848 
850  CLI11_NODISCARD std::string get_type_name() const;
851 
852  private:
854  void _validate_results(results_t &res) const;
855 
859  void _reduce_results(results_t &out, const results_t &original) const;
860 
861  // Run a result through the Validators
862  std::string _validate(std::string &result, int index) const;
863 
865  int _add_result(std::string &&result, std::vector<std::string> &res) const;
866 };
867 
868 // [CLI11:option_hpp:end]
869 } // namespace CLI
870 
871 #ifndef CLI11_COMPILE
872 #include "impl/Option_inl.hpp" // IWYU pragma: export
873 #endif
bool run_callback_for_default_
Control option to run the callback to set the default.
Definition: Option.hpp:363
CLI11_NODISCARD std::string get_default_str() const
The default value (for help printing)
Definition: Option.hpp:582
CLI11_NODISCARD const std::vector< std::string > & get_lnames() const
Get the long names.
Definition: Option.hpp:588
std::string option_text_
If given, replace the text that describes the option type and usage in the help text.
Definition: Option.hpp:297
CLI11_NODISCARD int get_type_size_min() const
The minimum number of arguments the option expects.
Definition: Option.hpp:565
CLI11_NODISCARD std::size_t count() const
Count the total number of times an option was passed.
Definition: Option.hpp:389
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) ...
CLI11_NODISCARD bool get_inject_separator() const
Return the inject_separator flag.
Definition: Option.hpp:570
std::function< std::string()> type_name_
Definition: Option.hpp:302
CRTP * required(bool value=true)
Set the option as required.
Definition: Option.hpp:118
take only the first Expected number of arguments
CLI11_NODISCARD bool get_run_callback_for_default() const
Get the current value of run_callback_for_default.
Definition: Option.hpp:444
std::string description_
The description for help strings.
Definition: Option.hpp:291
Option * needs(std::string opt_name)
Can find a string if needed.
Definition: Option.hpp:493
option_state
enumeration for the option state machine
Definition: Option.hpp:350
CLI11_NODISCARD std::set< Option * > get_excludes() const
The set of options excluded.
Definition: Option.hpp:579
CRTP * group(const std::string &name)
Changes the group membership.
Definition: Option.hpp:109
Definition: App.hpp:36
Option * check(Validator_p validator)
Adds a shared validator.
bool ignore_underscore_
Ignore underscores when matching (option, not value)
Definition: Option.hpp:82
bool ignore_case_
Ignore the case when matching (option, not value)
Definition: Option.hpp:79
void copy_to(T *other) const
Copy the contents to another similar class (one based on OptionBase)
CLI11_NODISCARD const std::vector< std::string > & get_snames() const
Get the short names.
Definition: Option.hpp:591
Option * callback_priority(CallbackPriority value=CallbackPriority::Normal)
Definition: Option.hpp:448
CLI11_NODISCARD char get_delimiter() const
Get the current delimiter char.
Definition: Option.hpp:152
std::string envname_
If given, check the environment for this option.
Definition: Option.hpp:284
CLI11_NODISCARD const std::string & get_option_text() const
Definition: Option.hpp:650
MultiOptionPolicy multi_option_policy_
Policy for handling multiple arguments beyond the expected Max.
Definition: Option.hpp:97
Throw an error if any extra arguments were given.
CLI11_NODISCARD int get_expected_min() const
The number of times the option expects to be included.
Definition: Option.hpp:612
CLI11_NODISCARD bool get_trigger_on_parse() const
The status of trigger on parse.
Definition: Option.hpp:427
CLI11_NODISCARD std::string get_envname() const
The environment variable associated to this value.
Definition: Option.hpp:573
CLI11_NODISCARD int get_type_size() const
The number of arguments the option expects.
Definition: Option.hpp:562
OptionDefaults * ignore_case(bool value=true)
Ignore the case of the option name.
Definition: Option.hpp:235
OptionDefaults * callback_priority(CallbackPriority value=CallbackPriority::Normal)
Set the callback priority.
Definition: Option.hpp:223
Option * needs(Option *opt)
Sets required options.
Definition: Option.hpp:485
std::set< Option * > excludes_
A list of options that are excluded with this option.
Definition: Option.hpp:329
bool trigger_on_result_
flag indicating that the option should trigger the validation and callback chain on each result when ...
Definition: Option.hpp:367
CLI11_NODISCARD MultiOptionPolicy get_multi_option_policy() const
The status of the multi option policy.
Definition: Option.hpp:158
Definition: Option.hpp:259
Option * type_name_fn(std::function< std::string()> typefun)
Set the type function to run when displayed on this option.
Definition: Option.hpp:775
STL namespace.
CLI11_NODISCARD bool has_description() const
True if option has description.
Definition: Option.hpp:634
void results(T &output) const
Get the results as a specified type.
Definition: Option.hpp:720
Validator * get_validator(const std::string &validator_name="")
Get a named Validator.
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...
CLI11_NODISCARD results_t reduced_results() const
Get a copy of the results.
The option is currently collecting parsed results.
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:596
CRTP * join(char delim)
Set the multi option policy to join with a specific delimiter.
Definition: Option.hpp:194
OptionDefaults * delimiter(char value= '\0')
set a delimiter character to split up single arguments to treat as multiple inputs ...
Definition: Option.hpp:253
CLI11_NODISCARD bool check_fname(std::string name) const
Requires "--" to be removed from string.
Definition: Option.hpp:693
Option * envname(std::string name)
Sets environment variable to read if no option given.
Definition: Option.hpp:532
CRTP * delimiter(char value= '\0')
Allow in a configuration file.
Definition: Option.hpp:208
Option * disable_flag_override(bool value=true)
Disable flag overrides values, e.g. –flag=is not allowed.
Definition: Option.hpp:553
MultiOptionPolicy
Enumeration of the multiOption Policy selection.
Definition: Option.hpp:43
Option & operator=(const Option &)=delete
OptionDefaults()=default
CLI11_NODISCARD bool get_configurable() const
The status of configurable.
Definition: Option.hpp:146
The normal, detailed help.
CLI11_NODISCARD bool get_required() const
True if this is a required option.
Definition: Option.hpp:137
Option * excludes(Option *opt)
Sets excluded options.
std::shared_ptr< Validator > Validator_p
Definition: Option.hpp:40
CLI11_NODISCARD bool check_sname(std::string name) const
Requires "-" to be removed from string.
Definition: Option.hpp:683
Option * default_function(const std::function< std::string()> &func)
Set a capture function for the default. Mostly used by App.
Definition: Option.hpp:796
CLI11_NODISCARD CallbackPriority get_callback_priority() const
The priority of callback.
Definition: Option.hpp:161
std::vector< std::string > fnames_
a list of flag names with specified default values;
Definition: Option.hpp:278
bool remove_excludes(Option *opt)
Remove needs link from an option. Returns true if the option really was in the needs list...
std::vector< std::string > snames_
A list of the short names (-a) without the leading dashes.
Definition: Option.hpp:268
Option * excludes(std::string opt_name)
Can find a string if needed.
Definition: Option.hpp:514
CLI11_NODISCARD const std::string & get_description() const
Get the description.
Definition: Option.hpp:637
Option * multi_option_policy(MultiOptionPolicy value=MultiOptionPolicy::Throw)
Take the last argument if given multiple times (or another policy)
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:422
Definition: Option.hpp:67
callback_t callback_
Options store a callback to do all the work.
Definition: Option.hpp:339
CRTP * take_first()
Set the multi option policy to take last.
Definition: Option.hpp:173
CallbackPriority callback_priority_
Priority of callback.
Definition: Option.hpp:100
CLI11_NODISCARD bool get_callback_run() const
See if the callback has been run already.
Definition: Option.hpp:768
int expected_min_
The minimum number of expected values.
Definition: Option.hpp:318
bool flag_like_
Specify that the option should act like a flag vs regular option.
Definition: Option.hpp:361
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_disable_flag_override() const
The status of configurable.
Definition: Option.hpp:149
OptionDefaults * ignore_underscore(bool value=true)
Ignore underscores in the option name.
Definition: Option.hpp:241
std::unique_ptr< Option > Option_p
Definition: Option.hpp:39
CLI11_MODULE_INLINE constexpr int expected_max_vector_size
Definition: StringTools.hpp:48
CLI11_NODISCARD int get_items_expected_min() const
The total min number of expected string values to be used.
Definition: Option.hpp:617
void inject_separator(bool value=true)
Set the value of the separator injection flag.
Definition: Option.hpp:793
std::vector< std::string > results_t
Definition: Option.hpp:31
CLI11_NODISCARD std::string get_flag_value(const std::string &name, std::string input_value) const
Thrown when conversion call back fails, such as when an int fails to coerce to a string.
Definition: Error.hpp:205
OptionDefaults * multi_option_policy(MultiOptionPolicy value=MultiOptionPolicy::Throw)
Take the last argument if given multiple times.
Definition: Option.hpp:229
Option * run_callback_for_default(bool value=true)
Definition: Option.hpp:439
int expected_max_
The maximum number of expected values.
Definition: Option.hpp:320
void clear()
Clear the parsed results (mostly for testing)
Definition: Option.hpp:398
CLI11_NODISCARD std::string get_type_name() const
Get the full typename for this option.
CLI11_NODISCARD bool get_force_callback() const
The status of force_callback.
Definition: Option.hpp:435
results_t proc_results_
results after reduction
Definition: Option.hpp:348
CLI11_NODISCARD bool get_allow_extra_args() const
Get the current value of allow extra args.
Definition: Option.hpp:420
bool always_capture_default_
Automatically capture default value.
Definition: Option.hpp:94
CLI11_NODISCARD int get_expected_max() const
The max number of times the option expects to be included.
Definition: Option.hpp:614
Option * option_text(std::string text)
Definition: Option.hpp:645
std::set< Option * > needs_
A list of options that are required with this option.
Definition: Option.hpp:326
CLI11_NODISCARD int get_expected() const
The number of times the option expects to be included.
Definition: Option.hpp:609
All errors derive from this one.
Definition: Error.hpp:73
std::string pname_
A positional name.
Definition: Option.hpp:281
CLI11_NODISCARD std::set< Option * > get_needs() const
The set of options needed.
Definition: Option.hpp:576
CLI11_INLINE std::tuple< std::vector< std::string >, std::vector< std::string >, std::string > get_names(const std::vector< std::string > &input, bool allow_non_standard=false)
Get a vector of short names, one of long names, and a single name.
CLI11_INLINE std::vector< std::string > split_names(std::string current)
bool required_
True if this is a required option.
Definition: Option.hpp:76
int type_size_min_
The minimum number of arguments an option should be expecting.
Definition: Option.hpp:315
std::vector< std::pair< std::string, std::string > > default_flag_values_
Definition: Option.hpp:275
bool disable_flag_override_
Disable overriding flag values with '=value'.
Definition: Option.hpp:88
Option * allow_extra_args(bool value=true)
Definition: Option.hpp:415
CLI11_NODISCARD bool check_name(const std::string &name) const
Check a name. Requires "-" or "--" for short / long, supports positional name.
Option * description(std::string option_description)
Set the description.
Definition: Option.hpp:640
std::vector< Validator_p > validators_
A list of Validators to run on each value parsed.
Definition: Option.hpp:323
Definition: Option.hpp:216
CRTP * join()
Set the multi option policy to join.
Definition: Option.hpp:187
CLI11_NODISCARD bool check_lname(std::string name) const
Requires "--" to be removed from string.
Definition: Option.hpp:688
CLI11_NODISCARD bool get_ignore_case() const
The status of ignore case.
Definition: Option.hpp:140
CLI11_NODISCARD const std::string & get_group() const
Get the group of this option.
Definition: Option.hpp:134
Option * type_size(int option_type_size)
Set a custom option size.
CRTP * take_last()
Set the multi option policy to take last.
Definition: Option.hpp:166
int type_size_max_
Definition: Option.hpp:313
CLI11_NODISCARD bool get_ignore_underscore() const
The status of ignore_underscore.
Definition: Option.hpp:143
App * parent_
link back up to the parent App for fallthrough
Definition: Option.hpp:336
Option * force_callback(bool value=true)
Set the value of force_callback.
Definition: Option.hpp:430
OptionDefaults * disable_flag_override(bool value=true)
Disable overriding flag values with an '=' segment.
Definition: Option.hpp:247
CLI11_NODISCARD int get_type_size_max() const
The maximum number of arguments the option expects.
Definition: Option.hpp:567
CallbackPriority
enumeration for the callback priority
Definition: Option.hpp:54
#define CLI11_NODISCARD
Definition: Macros.hpp:58
bool inject_separator_
flag indicating a separator needs to be injected after each argument call
Definition: Option.hpp:365
CLI11_NODISCARD bool nonpositional() const
True if option has at least one non-positional name.
Definition: Option.hpp:631
CRTP * configurable(bool value=true)
Allow in a configuration file.
Definition: Option.hpp:202
std::vector< std::string > lnames_
A list of the long names (--long) without the leading dashes.
Definition: Option.hpp:271
Some validators that are provided.
Definition: Validators.hpp:54
CLI11_NODISCARD const std::string & matching_name(const Option &other) const
If options share any of the same names, find it.
CLI11_INLINE 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...
take only the last Expected number of arguments
bool configurable_
Allow this option to be given in a configuration file.
Definition: Option.hpp:85
bool allow_extra_args_
Specify that extra args beyond type_size_max should be allowed.
Definition: Option.hpp:359
bool operator==(const Option &other) const
If options share any of the same names, they are equal (not counting positional)
Definition: Option.hpp:677
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
Option * type_name(std::string typeval)
Set a custom option typestring.
Definition: Option.hpp:781
Option * transform(Validator_p validator)
Adds a shared Validator.
Option * ignore_case(bool value=true)
the callback has been executed
std::string value_string(const T &value)
get a string as a convertible value for arithmetic types
Definition: TypeTools.hpp:470
std::string default_str_
A human readable default value, either manually set, captured, or captured by default.
Definition: Option.hpp:294
CRTP * mandatory(bool value=true)
Support Plumbum term.
Definition: Option.hpp:124
std::function< bool(const results_t &)> callback_t
callback function definition
Definition: Option.hpp:33
CLI11_NODISCARD const results_t & results() const
Get the current complete results set.
Definition: Option.hpp:714
CRTP * always_capture_default(bool value=true)
Definition: Option.hpp:126
option_state current_option_state_
Whether the callback has run (needed for INI parsing)
Definition: Option.hpp:357
CLI11_NODISCARD int get_items_expected() const
The total min number of expected string values to be used.
Definition: Option.hpp:625
results_t results_
complete Results of parsing
Definition: Option.hpp:346
std::string group_
The group membership.
Definition: Option.hpp:73
Option * excludes(A opt, B opt1, ARG...args)
Any number supported, any mix of string and Opt.
Definition: Option.hpp:523
merge all the arguments together into a single string via the delimiter character default(' ') ...
Creates a command line program, with very few defaults.
Definition: App.hpp:115
just get all the passed argument regardless
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:620
CLI11_NODISCARD callback_t get_callback() const
Get the callback function.
Definition: Option.hpp:585
This converter works with INI/TOML files; to write INI files use ConfigINI.
Definition: ConfigFwd.hpp:90
the results have been validated
Option * needs(A opt, B opt1, ARG...args)
Any number supported, any mix of string and Opt.
Definition: Option.hpp:502
CLI11_NODISCARD bool get_positional() const
True if the argument can be given directly.
Definition: Option.hpp:628
CLI11_NODISCARD const std::vector< std::string > & get_fnames() const
Get the flag names with specified default values.
Definition: Option.hpp:594
bool remove_needs(Option *opt)
Remove needs link from an option. Returns true if the option really was in the needs list...
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:307
sum all the arguments together if numerical or concatenate directly without delimiter ...
Option * expected(int value)
Set the number of expected arguments.
char delimiter_
Specify a delimiter character for vector arguments.
Definition: Option.hpp:91
take only the last Expected number of arguments in reverse order
bool valid_alias_name_string(const std::string &str)
Verify an app name.
Definition: StringTools.hpp:167
Option * default_str(std::string val)
Set the default value string representation (does not change the contained value) ...
Definition: Option.hpp:810
Option * capture_default_str()
Capture the default value from the original value (if it can be captured)
Definition: Option.hpp:802
a subset of results has been generated
CRTP * take_all()
Set the multi option policy to take all arguments.
Definition: Option.hpp:180
Option * add_result(std::string s)
Puts a result at the end.
std::function< std::string()> default_function_
Run this function to capture a default (ignore if empty)
Definition: Option.hpp:305
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:372
Option * default_val(const X &val)
Definition: Option.hpp:817
void run_callback()
Process the callback.
CLI11_NODISCARD T as() const
Return the results as the specified type.
Definition: Option.hpp:761
Option * ignore_underscore(bool value=true)
CLI11_NODISCARD bool empty() const
True if the option was not passed.
Definition: Option.hpp:392