advgetopt 2.0.47
Parse complex command line arguments and configuration files in C++.
options.h
Go to the documentation of this file.
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
30// self
31//
33
34#include <advgetopt/conf_file.h>
35
36
37// snapdev
38//
39#include <snapdev/not_used.h>
40
41
42
43namespace advgetopt
44{
45
46
47
48
49
50
51// this structure is used to declare your command line options in a
52// constexpr array
53//
54// TODO: plan to transform all the strings in an array with a scheme such
55// as:
56//
57// "a:<alias>",
58// "d:<default>",
59// "h:<help>",
60// "n:<name>",
61// "s:<separator>",
62// "v:<validator>(<param>, ...)"
63//
64// our templates should be able to create that array automatically.
65// This way we avoid many nullptr in so many definitions (i.e. most of
66// our definitions do not have a default, separators, or a validator)
67// We would also avoid the alias/help overload.
68//
69struct option
70{
71 short_name_t f_short_name = NO_SHORT_NAME; // letter option (or NO_SHORT_NAME == U'\0')
72 flag_t f_flags = GETOPT_FLAG_NONE; // set of flags
73 char const * f_name = nullptr; // name of the option (i.e. "test" for --test, or nullptr)
74 char const * f_environment_variable_name = nullptr; // name of an environment variable to read for the value from
75 char const * f_default = nullptr; // a default value if not nullptr
76 char const * f_help = nullptr; // help for this option, if nullptr it's a hidden option; if ALIAS then this is the actual alias
77 char const * f_validator = nullptr; // the name of a validator and optional parameters between parenthesis
78 char const * const *f_multiple_separators = nullptr; // nullptr terminated list of strings used as separators when GETOPT_FLAG_MULTIPLE is set
79};
80
81
82
83template<typename T>
85{
86public:
87 typedef T value_t;
88
89 constexpr OptionValue(T const v)
90 : f_value(v)
91 {
92 }
93
94 constexpr value_t get() const
95 {
96 return f_value;
97 }
98
99private:
101};
102
103
105 : public OptionValue<short_name_t>
106{
107public:
108 constexpr ShortName()
110 {
111 }
112
113 constexpr ShortName(short_name_t name)
115 {
116 }
117};
118
119class Flags
120 : public OptionValue<flag_t>
121{
122public:
123 constexpr Flags()
125 {
126 }
127
128 constexpr Flags(flag_t flags)
130 {
131 }
132};
133
134class Name
135 : public OptionValue<char const *>
136{
137public:
138 constexpr Name()
140 {
141 }
142
143 constexpr Name(char const * name)
144 : OptionValue<char const *>(name)
145 {
146 }
147};
148
150 : public OptionValue<char const *>
151{
152public:
155 {
156 }
157
158 constexpr EnvironmentVariableName(char const * name)
159 : OptionValue<char const *>(name)
160 {
161 }
162};
163
165 : public OptionValue<char const *>
166{
167public:
168 constexpr DefaultValue()
170 {
171 }
172
173 constexpr DefaultValue(char const * default_value)
175 {
176 }
177};
178
179class Alias
180 : public OptionValue<char const *>
181{
182public:
183 constexpr Alias()
185 {
186 }
187
188 constexpr Alias(char const * alias)
190 {
191 }
192};
193
194class Help
195 : public OptionValue<char const *>
196{
197public:
198 constexpr Help()
200 {
201 }
202
203 constexpr Help(char const * help)
205 {
206 }
207};
208
210 : public OptionValue<char const *>
211{
212public:
213 constexpr Validator()
215 {
216 }
217
218 constexpr Validator(char const * validator)
220 {
221 }
222};
223
225 : public OptionValue<char const * const *>
226{
227public:
228 constexpr Separators()
230 {
231 }
232
233 constexpr Separators(char const * const * separators)
235 {
236 }
237};
238
239
240
241template<typename T, typename F, class ...ARGS>
242constexpr typename std::enable_if<std::is_same<T, F>::value, typename T::value_t>::type find_option(F first, ARGS ...args)
243{
244 snapdev::NOT_USED(args...);
245 return first.get();
246}
247
248
249template<typename T, typename F, class ...ARGS>
250constexpr typename std::enable_if<!std::is_same<T, F>::value, typename T::value_t>::type find_option(F first, ARGS ...args)
251{
252 snapdev::NOT_USED(first);
253 return find_option<T>(args...);
254}
255
256
257
258template<class ...ARGS>
260{
261#pragma GCC diagnostic push
262#pragma GCC diagnostic ignored "-Wpedantic"
263 option opt =
264 {
266 .f_flags = find_option<Flags >(args..., Flags())
267 | (find_option<Alias>(args..., Alias()) != nullptr
273 .f_name = find_option<Name >(args...), // no default, must be defined
274 .f_environment_variable_name =
276 .f_default = find_option<DefaultValue>(args..., DefaultValue()),
277 .f_help = find_option<Alias >(args..., Alias()) != nullptr
280 .f_validator = find_option<Validator >(args..., Validator()),
281 .f_multiple_separators = find_option<Separators >(args..., Separators()),
282 };
283#pragma GCC diagnostic pop
284
285 // TODO: once possible (C++17/20?) add verification tests here
286
287 return opt;
288}
289
290
291
292
293
295{
296 return define_option(
297 advgetopt::Name(nullptr)
299 );
300}
301
302
303
304
305
306
307
308
310{
311 flag_t f_group = GETOPT_FLAG_GROUP_NONE; // the default is used to mark the end of the list
312 char const * f_name = nullptr; // for --<name>-help
313 char const * f_description = nullptr; // for usage() output
314};
315
316
317
318
319template<typename T>
321{
322public:
323 typedef T value_t;
324
325 constexpr GroupValue(T const v)
326 : f_value(v)
327 {
328 }
329
330 constexpr value_t get() const
331 {
332 return f_value;
333 }
334
335private:
337};
338
340 : public OptionValue<flag_t>
341{
342public:
343 constexpr GroupNumber()
345 {
346 }
347
350 {
351 }
352};
353
355 : public GroupValue<char const *>
356{
357public:
358 constexpr GroupName()
360 {
361 }
362
363 constexpr GroupName(char const * name)
364 : GroupValue<char const *>(name)
365 {
366 }
367};
368
370 : public GroupValue<char const *>
371{
372public:
375 {
376 }
377
378 constexpr GroupDescription(char const * description)
380 {
381 }
382};
383
384
385template<typename T, typename F, class ...ARGS>
386constexpr typename std::enable_if<std::is_same<T, F>::value, typename T::value_t>::type find_group(F first, ARGS ...args)
387{
388 snapdev::NOT_USED(args...);
389 return first.get();
390}
391
392
393template<typename T, typename F, class ...ARGS>
394constexpr typename std::enable_if<!std::is_same<T, F>::value, typename T::value_t>::type find_group(F first, ARGS ...args)
395{
396 snapdev::NOT_USED(first);
397 return find_group<T>(args...);
398}
399
400
401
402template<class ...ARGS>
404{
405#pragma GCC diagnostic push
406#pragma GCC diagnostic ignored "-Wpedantic"
408 {
410 .f_name = find_group<GroupName >(args..., GroupName()),
411 .f_description = find_group<GroupDescription>(args..., GroupDescription()),
412 };
413#pragma GCC diagnostic pop
414
415 return grp;
416}
417
418
420{
421 // the defaults are what we expect to end the list of groups
422 return define_group();
423}
424
425
426
427
428
429
430
431
432constexpr flag_t GETOPT_ENVIRONMENT_FLAG_DYNAMIC_PARAMETERS = 0x0001; // accept parameters that are not declared
433
434constexpr flag_t GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS = 0x0002; // add system parameters (i.e. --help, --version, etc.)
435constexpr flag_t GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS = 0x0004; // add & process system parameters
436constexpr flag_t GETOPT_ENVIRONMENT_FLAG_DEBUG_SOURCE = 0x0008; // debug source for each option
437constexpr flag_t GETOPT_ENVIRONMENT_FLAG_AUTO_DONE = 0x0010; // if you want a valid getopt structure without parsing arguments, set this flag
438
439
441{
442 char const * f_project_name = nullptr; // project/application name--used as filename for the .conf files (%a)
443 char const * f_group_name = nullptr; // sub-folder name (i.e. "snapwebsites")--if nullptr, use f_project_name
444 option const * f_options = nullptr; // raw options
445 char const * f_options_files_directory = nullptr; // directory to check for option files (default "/usr/shared/advgetopt")
446 char const * f_environment_variable_name = nullptr; // environment variable with additional options (%e)
447 char const * f_environment_variable_intro = nullptr; // introducer for option specific environment variable names (%E)
448 char const * f_section_variables_name = nullptr; // the name of a section representing variables (%m)
449 char const * const * f_configuration_files = nullptr; // nullptr terminated array of full paths to configuration files (%f)
450 char const * f_configuration_filename = nullptr; // the configuration filename to search in f_configuration_directories (%g)
451 char const * const * f_configuration_directories = nullptr; // nullptr terminated array of paths only to configuration files (%d)
452 flag_t f_environment_flags = 0; // GETOPT_ENVIRONMENT_FLAG_...
453 char const * f_help_header = nullptr; // show on --help
454 char const * f_help_footer = nullptr; // show on --help
455 char const * f_version = nullptr; // show on --version and %v
456 char const * f_license = nullptr; // show on --license and %l
457 char const * f_copyright = nullptr; // show on --copyright and %c
458 char const * f_build_date = UTC_BUILD_DATE; // available to parameter %b
459 char const * f_build_time = UTC_BUILD_TIME; // available to parameter %t
460 group_description const * f_groups = nullptr; // nullptr terminated array of group names %s
461 conf_file_setup const * f_config_setup = nullptr; // default configuration file setup (except the filename)
462};
463
464
465
466
467
468} // namespace advgetopt
469// vim: ts=4 sw=4 et
constexpr Alias(char const *alias)
Definition options.h:188
constexpr Alias()
Definition options.h:183
constexpr DefaultValue()
Definition options.h:168
constexpr DefaultValue(char const *default_value)
Definition options.h:173
constexpr EnvironmentVariableName(char const *name)
Definition options.h:158
constexpr Flags()
Definition options.h:123
constexpr Flags(flag_t flags)
Definition options.h:128
constexpr GroupDescription(char const *description)
Definition options.h:378
constexpr GroupDescription()
Definition options.h:373
constexpr GroupName(char const *name)
Definition options.h:363
constexpr GroupName()
Definition options.h:358
constexpr GroupNumber()
Definition options.h:343
constexpr GroupNumber(flag_t group)
Definition options.h:348
constexpr value_t get() const
Definition options.h:330
constexpr GroupValue(T const v)
Definition options.h:325
constexpr Help(char const *help)
Definition options.h:203
constexpr Help()
Definition options.h:198
constexpr Name()
Definition options.h:138
constexpr Name(char const *name)
Definition options.h:143
constexpr OptionValue(T const v)
Definition options.h:89
constexpr value_t get() const
Definition options.h:94
constexpr Separators(char const *const *separators)
Definition options.h:233
constexpr Separators()
Definition options.h:228
constexpr ShortName(short_name_t name)
Definition options.h:113
constexpr ShortName()
Definition options.h:108
constexpr Validator(char const *validator)
Definition options.h:218
constexpr Validator()
Definition options.h:213
Declaration of the conf_file class used to read a configuration file.
The advgetopt environment to parse command line options.
constexpr group_description define_group(ARGS ...args)
Definition options.h:403
static constexpr flag_t GETOPT_FLAG_NONE
Definition flags.h:43
constexpr group_description end_groups()
Definition options.h:419
constexpr flag_t GETOPT_ENVIRONMENT_FLAG_DYNAMIC_PARAMETERS
Definition options.h:432
constexpr option define_option(ARGS ...args)
Definition options.h:259
constexpr flag_t end_flags()
Definition flags.h:123
constexpr flag_t option_flags_merge()
Definition flags.h:87
constexpr option end_options()
Definition options.h:294
constexpr short_name_t NO_SHORT_NAME
Definition option_info.h:51
std::uint32_t flag_t
Definition flags.h:41
char32_t short_name_t
Definition option_info.h:49
constexpr flag_t GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS
Definition options.h:435
static constexpr flag_t GETOPT_FLAG_GROUP_NONE
Definition flags.h:70
constexpr flag_t GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS
Definition options.h:434
constexpr std::enable_if< std::is_same< T, F >::value, typenameT::value_t >::type find_option(F first, ARGS ...args)
Definition options.h:242
constexpr flag_t GETOPT_ENVIRONMENT_FLAG_DEBUG_SOURCE
Definition options.h:436
constexpr flag_t GETOPT_ENVIRONMENT_FLAG_AUTO_DONE
Definition options.h:437
static constexpr flag_t GETOPT_FLAG_ENVIRONMENT_VARIABLE
Definition flags.h:46
constexpr std::enable_if< std::is_same< T, F >::value, typenameT::value_t >::type find_group(F first, ARGS ...args)
Definition options.h:386
static constexpr flag_t GETOPT_FLAG_ALIAS
Definition flags.h:50
Declaration of the option_info class used to record available options.
Structure representing an option.
Definition options.h:70
char const *const * f_multiple_separators
Definition options.h:78
short_name_t f_short_name
Definition options.h:71
char const * f_help
Definition options.h:76
char const * f_validator
Definition options.h:77
char const * f_environment_variable_name
Definition options.h:74
char const * f_name
Definition options.h:73
char const * f_default
Definition options.h:75
char const *const * f_configuration_directories
Definition options.h:451
char const * f_options_files_directory
Definition options.h:445
conf_file_setup const * f_config_setup
Definition options.h:461
char const * f_environment_variable_intro
Definition options.h:447
char const * f_section_variables_name
Definition options.h:448
char const * f_configuration_filename
Definition options.h:450
char const * f_environment_variable_name
Definition options.h:446
char const *const * f_configuration_files
Definition options.h:449
group_description const * f_groups
Definition options.h:460

This document is part of the Snap! Websites Project.

Copyright by Made to Order Software Corp.