13#include "StringTools.hpp"
14#include "TypeTools.hpp"
31#if defined CLI11_HAS_FILESYSTEM && CLI11_HAS_FILESYSTEM > 0
62 std::function<std::string(std::string &)>
func_{[](std::string &) {
return std::string{}; }};
72 Validator(std::string validator_desc, std::function<std::string(std::string &)> func);
79 Validator(std::function<std::string(std::string &)> op,
80 std::string validator_desc,
81 std::string validator_name =
"");
83 Validator &
operation(std::function<std::string(std::string &)> op) {
84 func_ = std::move(op);
89 std::string
operator()(std::string &str)
const;
93 std::string
operator()(
const std::string &str)
const;
106 Validator &
name(std::string validator_name) {
107 name_ = std::move(validator_name);
111 CLI11_NODISCARD
Validator name(std::string validator_name)
const;
115 Validator &
active(
bool active_val =
true) {
154 void _merge_description(
const Validator &val1,
const Validator &val2,
const std::string &merger);
158using CustomValidator = Validator;
166enum class path_type : std::uint8_t { nonexistent, file, directory };
169CLI11_INLINE path_type check_path(
const char *file)
noexcept;
174class ExistingFileValidator :
public Validator {
176 ExistingFileValidator();
180class ExistingDirectoryValidator :
public Validator {
182 ExistingDirectoryValidator();
186class ExistingPathValidator :
public Validator {
188 ExistingPathValidator();
192class NonexistentPathValidator :
public Validator {
194 NonexistentPathValidator();
197class EscapedStringTransformer :
public Validator {
199 EscapedStringTransformer();
221class FileOnDefaultPath :
public Validator {
223 explicit FileOnDefaultPath(std::string default_path,
bool enableErrorReturn =
true);
233 template <
typename T>
234 Range(T min_val, T max_val,
const std::string &validator_name = std::string{}) :
Validator(validator_name) {
235 if(validator_name.empty()) {
236 std::stringstream out;
237 out << detail::type_name<T>() <<
" in [" << min_val <<
" - " << max_val <<
"]";
238 description(out.str());
241 func_ = [min_val, max_val](std::string &input) {
242 using CLI::detail::lexical_cast;
244 bool converted = lexical_cast(input, val);
245 if((!converted) || (val < min_val || val > max_val)) {
246 std::stringstream out;
247 out <<
"Value " << input <<
" not in range [";
248 out << min_val <<
" - " << max_val <<
"]";
251 return std::string{};
256 template <
typename T>
257 explicit Range(T max_val,
const std::string &validator_name = std::string{})
258 :
Range(static_cast<T>(0), max_val, validator_name) {}
262CLI11_MODULE_INLINE
const Range NonNegativeNumber((std::numeric_limits<double>::max)(),
"NONNEGATIVE");
265CLI11_MODULE_INLINE
const
266 Range PositiveNumber((std::numeric_limits<double>::denorm_min)(), (std::numeric_limits<double>::max)(),
"POSITIVE");
274inline typename std::enable_if<std::is_signed<T>::value,
bool>::type overflowCheck(
const T &a,
const T &b) {
275 if((a > 0) == (b > 0)) {
276 return ((std::numeric_limits<T>::max)() / (std::abs)(a) < (std::abs)(b));
278 return ((std::numeric_limits<T>::min)() / (std::abs)(a) > -(std::abs)(b));
282inline typename std::enable_if<!std::is_signed<T>::value,
bool>::type overflowCheck(
const T &a,
const T &b) {
283 return ((std::numeric_limits<T>::max)() / a < b);
287template <
typename T>
typename std::enable_if<std::is_integral<T>::value,
bool>::type checked_multiply(T &a, T b) {
288 if(a == 0 || b == 0 || a == 1 || b == 1) {
292 if(a == (std::numeric_limits<T>::min)() || b == (std::numeric_limits<T>::min)()) {
295 if(overflowCheck(a, b)) {
304typename std::enable_if<std::is_floating_point<T>::value,
bool>::type checked_multiply(T &a, T b) {
306 if(std::isinf(c) && !std::isinf(a) && !std::isinf(b)) {
316CLI11_INLINE std::pair<std::string, std::string> split_program_name(std::string commandline);
325#include "impl/Validators_inl.hpp"
Definition Option.hpp:261
Produce a range (factory). Min and max are inclusive.
Definition Validators.hpp:227
Range(T min_val, T max_val, const std::string &validator_name=std::string{})
Definition Validators.hpp:234
Range(T max_val, const std::string &validator_name=std::string{})
Range of one value is 0 to value.
Definition Validators.hpp:257
Some validators that are provided.
Definition Validators.hpp:55
Validator operator&(const Validator &other) const
Definition Validators_inl.hpp:86
CLI11_NODISCARD int get_application_index() const
Get the current value of the application index.
Definition Validators.hpp:135
int application_index_
A Validator will only apply to an indexed value (-1 is all elements).
Definition Validators.hpp:66
Validator & non_modifying(bool no_modify=true)
Specify whether the Validator can be modifying or not.
Definition Validators.hpp:123
Validator & description(std::string validator_desc)
Specify the type string.
Definition Validators.hpp:96
Validator operator|(const Validator &other) const
Definition Validators_inl.hpp:108
CLI11_NODISCARD bool get_active() const
Get a boolean if the validator is active.
Definition Validators.hpp:137
bool active_
Enable for Validator to allow it to be disabled if need be.
Definition Validators.hpp:68
bool non_modifying_
specify that a validator should not modify the input
Definition Validators.hpp:70
Validator(std::string validator_desc)
Construct a Validator with just the description string.
Definition Validators.hpp:77
Validator & name(std::string validator_name)
Specify the type string.
Definition Validators.hpp:106
std::function< std::string()> desc_function_
This is the description function, if empty the description_ will be used.
Definition Validators.hpp:58
std::function< std::string(std::string &)> func_
Definition Validators.hpp:62
CLI11_NODISCARD std::string get_description() const
Generate type description information for the Validator.
Definition Validators_inl.hpp:61
CLI11_NODISCARD const std::string & get_name() const
Get the name of the Validator.
Definition Validators.hpp:113
Validator & active(bool active_val=true)
Specify whether the Validator is active or not.
Definition Validators.hpp:115
std::string name_
The name for search purposes of the Validator.
Definition Validators.hpp:64
CLI11_NODISCARD bool get_modifying() const
Get a boolean if the validator is allowed to modify the input returns true if it can modify the input...
Definition Validators.hpp:140
Validator operator!() const
Create a validator that fails when a given validator succeeds.
Definition Validators_inl.hpp:130
std::string operator()(std::string &str) const
Definition Validators_inl.hpp:37
Validator & application_index(int app_index)
Specify the application index of a validator.
Definition Validators.hpp:128
Validator & operation(std::function< std::string(std::string &)> op)
Set the Validator operation function.
Definition Validators.hpp:83
Check for an existing directory (returns error message if check fails).
Definition Validators.hpp:180
Check for an existing file (returns error message if check fails).
Definition Validators.hpp:174
Check for an existing path.
Definition Validators.hpp:186
Check for an non-existing path.
Definition Validators.hpp:192