10#include "../ExtraValidators.hpp"
12#if (defined(CLI11_ENABLE_EXTRA_VALIDATORS) && CLI11_ENABLE_EXTRA_VALIDATORS == 1) || \
13 (!defined(CLI11_DISABLE_EXTRA_VALIDATORS) || CLI11_DISABLE_EXTRA_VALIDATORS == 0)
15#include "../Encoding.hpp"
16#include "../Macros.hpp"
17#include "../StringTools.hpp"
18#include "../TypeTools.hpp"
33CLI11_INLINE IPV4Validator::IPV4Validator() : Validator(
"IPV4") {
34 func_ = [](std::string &ip_addr) {
35 auto cdot = std::count(ip_addr.begin(), ip_addr.end(),
'.');
37 return std::string(
"Invalid IPV4 address: must have 3 separators");
39 auto result = CLI::detail::split(ip_addr,
'.');
41 for(
const auto &var : result) {
42 using CLI::detail::lexical_cast;
43 bool retval = lexical_cast(var, num);
45 return std::string(
"Failed parsing number (") + var +
')';
47 if(num < 0 || num > 255) {
48 return std::string(
"Each IP number must be between 0 and 255 ") + var;
59 description(
"SIZE [b, kb(=1000b), kib(=1024b), ...]");
65CLI11_INLINE std::map<std::string, AsSizeValue::result_t> AsSizeValue::init_mapping(
bool kb_is_1000) {
66 std::map<std::string, result_t> m;
67 result_t k_factor = kb_is_1000 ? 1000 : 1024;
68 result_t ki_factor = 1024;
72 for(std::string p : {
"k",
"m",
"g",
"t",
"p",
"e"}) {
83CLI11_INLINE
const std::map<std::string, AsSizeValue::result_t> &AsSizeValue::get_mapping(
bool kb_is_1000) {
85 static auto m = init_mapping(
true);
88 static auto m = init_mapping(
false);
92#if defined(CLI11_ENABLE_EXTRA_VALIDATORS) && CLI11_ENABLE_EXTRA_VALIDATORS != 0
95#if defined CLI11_HAS_FILESYSTEM && CLI11_HAS_FILESYSTEM > 0
97CLI11_INLINE PermissionValidator::PermissionValidator(Permission permission) {
98 std::filesystem::perms permission_code = std::filesystem::perms::none;
99 std::string permission_name;
101 case Permission::read:
102 permission_code = std::filesystem::perms::owner_read | std::filesystem::perms::group_read |
103 std::filesystem::perms::others_read;
104 permission_name =
"read";
106 case Permission::write:
107 permission_code = std::filesystem::perms::owner_write | std::filesystem::perms::group_write |
108 std::filesystem::perms::others_write;
109 permission_name =
"write";
111 case Permission::exec:
112 permission_code = std::filesystem::perms::owner_exec | std::filesystem::perms::group_exec |
113 std::filesystem::perms::others_exec;
114 permission_name =
"exec";
116 case Permission::none:
118 permission_code = std::filesystem::perms::none;
121 func_ = [permission_code](std::string &path) {
123 auto p = std::filesystem::path(path);
124 if(!std::filesystem::exists(p, ec)) {
125 return std::string(
"Path does not exist: ") + path;
128 return std::string(
"Error checking path: ") + ec.message();
130 if(permission_code == std::filesystem::perms::none) {
131 return std::string{};
133 auto perms = std::filesystem::status(p, ec).permissions();
135 return std::string(
"Error checking path status: ") + ec.message();
137 if((perms & permission_code) == std::filesystem::perms::none) {
138 return std::string(
"Path does not have required permissions: ") + path;
140 return std::string{};
142 description(
"Path with " + permission_name +
" permission");
146CLI11_INLINE FileSizeValidator::FileSizeValidator(std::uint64_t min_size, std::uint64_t max_size) {
149 desc =
"File size at least " + std::to_string(min_size) +
" bytes";
151 desc =
"File size between " + std::to_string(min_size) +
" and " + std::to_string(max_size) +
" bytes";
154 func_ = [min_size, max_size](std::string &path) {
156 auto p = std::filesystem::path(path);
157 if(!std::filesystem::exists(p, ec)) {
158 return std::string(
"File does not exist: ") + path;
161 return std::string(
"Error checking file: ") + ec.message();
163 auto size = std::filesystem::file_size(p, ec);
165 return std::string(
"Error getting file size: ") + ec.message();
167 if(size < min_size) {
168 return std::string(
"File size ") + std::to_string(size) +
" bytes is less than minimum " +
169 std::to_string(min_size) +
" bytes";
171 if(max_size > 0 && size > max_size) {
172 return std::string(
"File size ") + std::to_string(size) +
" bytes exceeds maximum " +
173 std::to_string(max_size) +
" bytes";
175 return std::string{};
AsSizeValue(bool kb_is_1000)
Definition ExtraValidators_inl.hpp:57
Validator & description(std::string validator_desc)
Specify the type string.
Definition Validators.hpp:99