Line data Source code
1 : // Copyright (c) 2006-2024 Made to Order Software Corp. All Rights Reserved 2 : // 3 : // https://snapwebsites.org/project/advgetopt 4 : // contact@m2osw.com 5 : // 6 : // This program is free software; you can redistribute it and/or modify 7 : // it under the terms of the GNU General Public License as published by 8 : // the Free Software Foundation; either version 2 of the License, or 9 : // (at your option) any later version. 10 : // 11 : // This program is distributed in the hope that it will be useful, 12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 : // GNU General Public License for more details. 15 : // 16 : // You should have received a copy of the GNU General Public License along 17 : // with this program; if not, write to the Free Software Foundation, Inc., 18 : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 : #pragma once 20 : 21 : /** \file 22 : * \brief Definitions of the options class a initialization functions. 23 : * 24 : * The advgetopt library offers an advanced way to manage your command 25 : * line tools options on the command line, in environment variables, and 26 : * in configuration files. 27 : */ 28 : 29 : 30 : // C++ 31 : // 32 : #include <cstdint> 33 : 34 : 35 : 36 : namespace advgetopt 37 : { 38 : 39 : 40 : 41 : typedef std::uint32_t flag_t; 42 : 43 : static constexpr flag_t GETOPT_FLAG_NONE = static_cast<flag_t>(0x00000000); 44 : 45 : static constexpr flag_t GETOPT_FLAG_COMMAND_LINE = static_cast<flag_t>(0x00000001); // acceptable on the command line 46 : static constexpr flag_t GETOPT_FLAG_ENVIRONMENT_VARIABLE = static_cast<flag_t>(0x00000002); // acceptable in environment variable 47 : static constexpr flag_t GETOPT_FLAG_CONFIGURATION_FILE = static_cast<flag_t>(0x00000004); // acceptable in configuration files 48 : static constexpr flag_t GETOPT_FLAG_DYNAMIC_CONFIGURATION = static_cast<flag_t>(0x00000008); // acceptable from the dynamic configuration system (see fluid-settings) 49 : 50 : static constexpr flag_t GETOPT_FLAG_ALIAS = static_cast<flag_t>(0x00000010); // alias, result in another option defined in "help" string 51 : static constexpr flag_t GETOPT_FLAG_FLAG = static_cast<flag_t>(0x00000020); // no parameter allowed (--help) 52 : static constexpr flag_t GETOPT_FLAG_REQUIRED = static_cast<flag_t>(0x00000040); // required (--host 127.0.0.1) 53 : static constexpr flag_t GETOPT_FLAG_MULTIPLE = static_cast<flag_t>(0x00000080); // any number of parameter is allowed (--files a b c d ...) 54 : static constexpr flag_t GETOPT_FLAG_DEFAULT_OPTION = static_cast<flag_t>(0x00000100); // where entries go by default (a.k.a. after "--") 55 : static constexpr flag_t GETOPT_FLAG_HAS_DEFAULT = static_cast<flag_t>(0x00000200); // default value is defined 56 : static constexpr flag_t GETOPT_FLAG_PROCESS_VARIABLES = static_cast<flag_t>(0x00000400); // variables within this parameter will automatically be processed 57 : static constexpr flag_t GETOPT_FLAG_ARRAY = static_cast<flag_t>(0x00000800); // allow for options to include an array or map specification (--opt[3] or --opt:back) 58 : 59 : static constexpr flag_t GETOPT_FLAG_SHOW_MOST = static_cast<flag_t>(0x00000000); // show in usage() when not in GROUP1 or GROUP2 60 : static constexpr flag_t GETOPT_FLAG_SHOW_USAGE_ON_ERROR = static_cast<flag_t>(0x00001000); // show in usage() when an error occurs 61 : static constexpr flag_t GETOPT_FLAG_SHOW_ALL = static_cast<flag_t>(0x00002000); // show in usage() when --long-help is used 62 : static constexpr flag_t GETOPT_FLAG_SHOW_GROUP1 = static_cast<flag_t>(0x00004000); // show in usage() when --<group1>-help is used (app dependent) 63 : static constexpr flag_t GETOPT_FLAG_SHOW_GROUP2 = static_cast<flag_t>(0x00008000); // show in usage() when --<group2>-help is used (app dependent) 64 : static constexpr flag_t GETOPT_FLAG_SHOW_SYSTEM = static_cast<flag_t>(0x00010000); // show in usage() when --system-help is used (options added by advgetopt, snaplogger, communicatord, etc.) 65 : 66 : static constexpr flag_t GETOPT_FLAG_GROUP_MASK = static_cast<flag_t>(0x00700000); 67 : static constexpr flag_t GETOPT_FLAG_GROUP_MINIMUM = static_cast<flag_t>(0); 68 : static constexpr flag_t GETOPT_FLAG_GROUP_MAXIMUM = static_cast<flag_t>(7); 69 : static constexpr flag_t GETOPT_FLAG_GROUP_SHIFT = static_cast<flag_t>(20); 70 : static constexpr flag_t GETOPT_FLAG_GROUP_NONE = static_cast<flag_t>(0x00000000); // not in a group 71 : static constexpr flag_t GETOPT_FLAG_GROUP_COMMANDS = static_cast<flag_t>(0x00100000); // in command group (group 1) 72 : static constexpr flag_t GETOPT_FLAG_GROUP_OPTIONS = static_cast<flag_t>(0x00200000); // in option group (group 2) 73 : static constexpr flag_t GETOPT_FLAG_GROUP_THREE = static_cast<flag_t>(0x00300000); // in group 3 74 : static constexpr flag_t GETOPT_FLAG_GROUP_FOUR = static_cast<flag_t>(0x00400000); // in group 4 75 : static constexpr flag_t GETOPT_FLAG_GROUP_FIVE = static_cast<flag_t>(0x00500000); // in group 5 76 : static constexpr flag_t GETOPT_FLAG_GROUP_SIX = static_cast<flag_t>(0x00600000); // in group 6 77 : static constexpr flag_t GETOPT_FLAG_GROUP_SEVEN = static_cast<flag_t>(0x00700000); // in group 7 78 : 79 : static constexpr flag_t GETOPT_FLAG_DYNAMIC = static_cast<flag_t>(0x20000000); // this value was found in a configuration file and dynamic parameters are allowed (i.e. no definition for this option was found) 80 : static constexpr flag_t GETOPT_FLAG_LOCK = static_cast<flag_t>(0x40000000); // this value is currently locked (can't be modified) 81 : 82 : static constexpr flag_t GETOPT_FLAG_END = static_cast<flag_t>(0x80000000); // mark the end of the list 83 : 84 : 85 : 86 : template<class none = void> 87 : constexpr flag_t option_flags_merge() 88 : { 89 : return GETOPT_FLAG_NONE; 90 : } 91 : 92 : 93 : template<flag_t flag, flag_t ...args> 94 : constexpr flag_t option_flags_merge() 95 : { 96 : static_assert((flag & GETOPT_FLAG_GROUP_MASK) == 0 97 : || (option_flags_merge<args...>() & GETOPT_FLAG_GROUP_MASK) == 0 98 : , "more than one GETOPT_FLAG_GROUP_... is not allowed within one set of flags."); 99 : 100 : return flag | option_flags_merge<args...>(); 101 : } 102 : 103 : 104 : template<flag_t flag, flag_t ...args> 105 : constexpr flag_t combine_option_flags() 106 : { 107 : constexpr flag_t result(option_flags_merge<flag, args...>()); 108 : 109 : static_assert(static_cast<int>((result & GETOPT_FLAG_FLAG) != 0) 110 : + static_cast<int>((result & (GETOPT_FLAG_REQUIRED | GETOPT_FLAG_MULTIPLE | GETOPT_FLAG_DEFAULT_OPTION)) != 0) 111 : + static_cast<int>((result & GETOPT_FLAG_END) != 0) 112 : <= 1 113 : , "flag GETOPT_FLAG_FLAG is not compatible with any of GETOPT_FLAG_REQUIRED | GETOPT_FLAG_MULTIPLE | GETOPT_FLAG_DEFAULT_OPTION or none of these flags were specified."); 114 : 115 : static_assert(((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) != 0) 116 : ^ ((result & GETOPT_FLAG_END) != 0) 117 : , "flags must include at least one of GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE or be set to GETOPT_FLAG_END"); 118 : 119 : return result; 120 : } 121 : 122 : 123 : constexpr flag_t end_flags() 124 : { 125 : return combine_option_flags<GETOPT_FLAG_END>(); 126 : } 127 : 128 : 129 : template<flag_t ...args> 130 : constexpr flag_t any_flags() 131 : { 132 : constexpr flag_t result(combine_option_flags<args...>()); 133 : 134 : static_assert((result & GETOPT_FLAG_END) == 0 135 : , "an option_flag() cannot include GETOPT_FLAG_END"); 136 : 137 : return result; 138 : } 139 : 140 : 141 : template<flag_t ...args> 142 : constexpr flag_t option_flags() 143 : { 144 : constexpr flag_t result(combine_option_flags<GETOPT_FLAG_FLAG, args...>()); 145 : 146 : //static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0 147 : // , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE"); 148 : 149 : return result; 150 : } 151 : 152 : 153 : template<flag_t ...args> 154 6 : constexpr flag_t all_flags() 155 : { 156 6 : constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE 157 : , GETOPT_FLAG_ENVIRONMENT_VARIABLE 158 : , GETOPT_FLAG_CONFIGURATION_FILE 159 : , args...>()); 160 : 161 6 : return result; 162 : } 163 : 164 : 165 : template<flag_t ...args> 166 : constexpr flag_t standalone_all_flags() 167 : { 168 : constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE 169 : , GETOPT_FLAG_ENVIRONMENT_VARIABLE 170 : , GETOPT_FLAG_CONFIGURATION_FILE 171 : , GETOPT_FLAG_FLAG 172 : , args...>()); 173 : 174 : return result; 175 : } 176 : 177 : 178 : template<flag_t ...args> 179 : constexpr flag_t standalone_command_flags() 180 : { 181 : constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE, GETOPT_FLAG_FLAG, args...>()); 182 : 183 : static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0 184 : , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE"); 185 : 186 : return result; 187 : } 188 : 189 : 190 : template<flag_t ...args> 191 18 : constexpr flag_t command_flags() 192 : { 193 18 : constexpr flag_t result(combine_option_flags<GETOPT_FLAG_COMMAND_LINE, args...>()); 194 : 195 : static_assert((result & (GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0 196 : , "an option_flag() cannot include GETOPT_FLAG_ENVIRONMENT_VARIABLE | GETOPT_FLAG_CONFIGURATION_FILE"); 197 : 198 18 : return result; 199 : } 200 : 201 : 202 : template<flag_t ...args> 203 : constexpr flag_t var_flags() 204 : { 205 : constexpr flag_t result(combine_option_flags<GETOPT_FLAG_ENVIRONMENT_VARIABLE, args...>()); 206 : 207 : static_assert((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_CONFIGURATION_FILE)) == 0 208 : , "a config_flag() cannot include GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_CONFIGURATION_FILE"); 209 : 210 : return result; 211 : } 212 : 213 : 214 : template<flag_t ...args> 215 : constexpr flag_t config_flags() 216 : { 217 : constexpr flag_t result(combine_option_flags<GETOPT_FLAG_CONFIGURATION_FILE, GETOPT_FLAG_REQUIRED, args...>()); 218 : 219 : static_assert((result & (GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE)) == 0 220 : , "a config_flag() cannot include GETOPT_FLAG_COMMAND_LINE | GETOPT_FLAG_ENVIRONMENT_VARIABLE"); 221 : 222 : return result; 223 : } 224 : 225 : 226 : 227 : 228 : 229 : 230 : } // namespace advgetopt 231 : // vim: ts=4 sw=4 et