ALib C++ Library
Library Version: 2402 R1
Documentation generated by doxygen
Loading...
Searching...
No Matches
arguments.hpp
Go to the documentation of this file.
1/** ************************************************************************************************
2 * \file
3 * This header file is part of module \alib_cli of the \aliblong.
4 *
5 * \emoji :copyright: 2013-2024 A-Worx GmbH, Germany.
6 * Published under \ref mainpage_license "Boost Software License".
7 **************************************************************************************************/
8#ifndef HPP_ALIB_CLI_ARGUMENTS
9#define HPP_ALIB_CLI_ARGUMENTS 1
10
11#if !defined (HPP_ALIB_CLI_CLI)
12 #include "alib/cli/cli.hpp"
13#endif
14
15#if !defined (HPP_ALIB_MONOMEM_LIST)
16# include "alib/monomem/list.hpp"
17#endif
18
19
20namespace alib { namespace cli {
21
22
23/**
24 * Struct used as parent for types
25 * - \alib{cli;Command},
26 * - \alib{cli;Option} and
27 * - \alib{cli;Parameter}.
28 *
29 * Stores
30 * - a pointer to the \alib{cli;CommandLine} object,
31 * - the position in \alib{ArgVN}, respectively \alib{ArgVW} where the object was found, and
32 * - the number of arguments consumed when reading the object.
33 *
34 * \note
35 * For technical reasons, other members that are shared between the derived types named above,
36 * have to be declared (each three times) with the types themselves.
37 */
38struct Parsed
39{
40 /** The cli command line. */
42
43 /** The index in \alib{ArgVN}, respectively \alib{ArgVW}, that this instance (derived option
44 * or parameter ) was found at. */
46
47 /** The number of command line arguments that a command consumed. This includes the command name
48 * itself. If method \b Read of derived types leaves this to <c>0</c>, then the option or
49 * parameter was not found. */
51
52 /**
53 * Constructor
54 * @param cmdLine The command line instance.
55 */
56 Parsed( CommandLine* cmdLine )
57 : CmdLine (cmdLine)
58 , Position ((std::numeric_limits<integer>::max)())
60 {}
61};
62
63
64// #################################################################################################
65// Decl and Def versions of commands, options, parameters and ExitCodes
66// #################################################################################################
67
68
69/**
70 * \ref alib_enums_records "ALib Enum Record" type used by class \alib{cli;ParameterDecl}.
71 */
73 {
74 /** The identifier of the parameter. */
76
77 /** An optional separator string (usually "=") that separates the parameter name from a
78 * value given within the parameter itself. */
80
81 /** A separator character for parsing multiple values.
82 * If set to <c>'C'</c>, method \alib{cli;ParameterDecl::ValueListSeparator} will return
83 * <c>','</c> instead. */
85
86 /** The number of arguments to consume and store in \alib{cli;Parameter::Args}.
87 * If negative, parsing stops. If previous field, separator string is set and this
88 * value is equal or greater to \c 1, then a missing separator string leads to
89 * a parsing exception. */
91
92 /** Denotes if this is an optional parameter. */
94
95 /** Default constructor leaving the record undefined. (Implementation required as documented
96 * \alib{enums;EnumRecordPrototype::EnumRecordPrototype();here}.) */
97 ERParameterDecl() noexcept = default;
98
99 /** Implementation of \alib{enums;EnumRecordPrototype::Parse}. */
101 void Parse();
102 };
103
104/**
105 * A parameter of a \alib{cli;CommandDecl}.
106 *
107 * Construction is done by passing a custom enum element of an enum type equipped with
108 * \ref alib_enums_records "ALib Enum Records" of type \alib{cli;ERParameterDecl}.
109 *
110 * When bootstrapping \alib_cli_nl, method \alib{cli;CommandLine::DefineParameters} has to be
111 * invoked for (each) enum type.
112 */
114{
115 protected:
116 /** The enumeration element given with construction. */
118
119 /** A copy (!) of the enum record. */
121
122 /** The resource information of the enumeration type given with construction. */
124
125 public:
126 /**
127 * Templated constructor which takes an enum element of a custom type equipped with
128 * \ref alib_enums_records "ALib Enum Records" of type \alib{cli;ERParameterDecl}.
129 *
130 * @tparam TEnum C++ enum type equipped with corresponding \alib Enum Records.
131 * @param element The enum element
132 */
133 template<typename TEnum>
134 ParameterDecl( TEnum element )
135 : declElement( element )
136 , resourceInfo(element)
137 {
138 // make a copy of the resourced record
139 record= enums::GetRecord(element);
140
141 // fix separator character
142 if( record.valueListSeparator == 'C' )
143 record.valueListSeparator= ',';
144 }
145
146 /**
147 * Returns the type and integral value of the enumeration element used with construction.
148 * @return The enumeration element used with construction.
149 */
150 const Enum& Element() const
151 {
152 return declElement;
153 }
154
155 /**
156 * Returns the name of the parameter. This is not the identifier. The name is just for
157 * help and configuration output.
158 *
159 * \see Method #Identifier.
160 *
161 * @return The name of the enum element.
162 */
163 const String& Name()
164 {
165 return record.EnumElementName;
166 }
167
168 /**
169 * Returns the identifier of the parameter. If this is empty, the parameter is not optional
170 * and hence has no identifier.
171 *
172 * @return The name of the enum element.
173 */
175 {
176 return record.identifier;
177 }
178
179 /**
180 * Returns the minimum parse length of the identifier.
181 * @return The minimum characters to satisfy the parameter.
182 */
184 {
185 return record.MinimumRecognitionLength;
186 }
187
188 /**
189 * An optional separator string (usually "="), that separates the parameter name from a
190 * parameter value.
191 * @return The separator string.
192 */
194 {
195 return record.valueSeparator;
196 }
197
198 /**
199 * A separator character for parsing multiple values.
200 * @return The separator character.
201 */
203 {
204 return record.valueListSeparator != 'C' ? record.valueListSeparator : ',';
205 }
206
207 /**
208 * The number of CLI arguments to consume and store in \alib{cli;Option::Args} with method
209 * \alib{cli;Parameter::Read}.
210 *
211 * @return The parameter identifier.
212 */
214 {
215 return record.qtyExpectedArgsFollowing;
216 }
217
218 /**
219 * Returns \c true if the parameter is optional. The information about this attribute is
220 * used to create help messages and usage format strings only. It does not automatically
221 * raise an exception if a parameter is not given. Such exception or other error treatment
222 * is up to the user code.
223 * @return \c true if the parameter is optional, \c false otherwise.
224 */
226 {
227 return record.isOptional;
228 }
229
230 /**
231 * Returns the short help text.
232 * Loads the string from #resourceInfo using resource name \c "THelpParShtNN",
233 * where \c NN is the enum element's integral value.
234 * @return The help text.
235 */
237 {
238 return resourceInfo.Get( NString64("THlpParSht_" ) << Name() ALIB_DBG(, true) );
239 }
240
241 /**
242 * Returns the long help text.
243 * Loads the string from #resourceInfo using resource name \c "THelpParLngNN",
244 * where \c NN is the enum element's integral value.
245 * @return The help text.
246 */
248 {
249 return resourceInfo.Get( String64("THlpParLng_" ) << Name() ALIB_DBG(, true));
250 }
251}; // ParameterDecl
252
253/**
254 * A declaration for a \alib{cli::Parameter}.
255 */
256struct Parameter : public Parsed
257{
258 /** The underlying declaration. */
259 ParameterDecl* Declaration = nullptr;
260
261 /** Arguments belonging to us. */
263
264 /**
265 * Constructor
266 * @param cmdLine The command line instance.
267 */
268 inline
269 Parameter( CommandLine* cmdLine );
270
271 /**
272 * Tries to read the object from the front of \alib{cli;CommandLine::ArgsLeft}.
273 * Success is indicated by setting inherited fields \alib{cli;Parsed::Position} and
274 * \alib{cli;Parsed::QtyArgsConsumed} to values greater than \c 0.
275 *
276 * If it could not be decided if the actual CLI argument contains this parameter \c false
277 * is returned to indicate that parsing commands has to stop now.
278 *
279 * This is done in the following cases:
280 * - When \alib{cli;ParameterDecl::Identifier} is empty and the parameter is
281 * \alib{cli;ParameterDecl::IsOptional} gives \c true.
282 * - When it was successfully read, but \alib{cli;ParameterDecl::QtyExpectedArgsFollowing}
283 * is defined \c -1.
284 *
285 * See \alib{cli;CommandLine;ReadNextCommands} for details
286 *
287 * @param decl The declaration used for reading
288 * @return The \c true on success, \c false indicates that parsing has to end here.
289 */
291 bool Read( ParameterDecl& decl );
292};
293
294/**
295 * \ref alib_enums_records "ALib Enum Record" type used by class \alib{cli;OptionDecl}.
296 */
298{
299 /** The name of the option as parsed from command line if single hyphen <c>'-'</c> is used.
300 * Defined as string to be able to have empty strings, which disables single character
301 * options. */
303
304 /** An optional separator string (usually "=") that separates the option name from a value
305 * within the first argument itself.
306 * If this is not given, field #qtyExpectedArgsFollowing has to be \c 0. */
308
309 /** The number of arguments to consume and store in \alib{cli;Option::Args}.
310 * If field #qtyExpectedArgsFollowing is set and this value is not \c 0, then a missing
311 * separator string leads to a parsing exception. */
313
314 /** If not empty, the argument string will be replaced by this and the search for next options
315 * continues.
316 * Note: Shortcut options have to occur earlier in the enumeration's resource definition. */
318
319 /** Defaulted constructor leaving the record undefined.
320 * (Implementation required as documented
321 * \alib{enums;EnumRecordPrototype::EnumRecordPrototype();here}.) */
322 EROptionDecl() noexcept = default;
323
324 /** Implementation of \alib{enums;EnumRecordPrototype::Parse}. */
326 void Parse();
327};
328
329/**
330 * A declaration for an \alib{cli::Option}.
331 *
332 * Construction is done by passing a custom enum element of an enum type equipped with
333 * \ref alib_enums_records "ALib Enum Records" of type \alib{cli;EROptionDecl}.
334 *
335 * When bootstrapping \alib_cli_nl, method \alib{cli;CommandLine::DefineOptions} has to be
336 * invoked for (each) enum type.
337 *
338 */
340{
341 protected:
342 /** The enumeration element given with construction. */
344
345 /** A copy (!) of the enum record. */
347
348 /** The resource information of the enumeration type given with construction. */
350
351
352 public:
353 /**
354 * Templated constructor which takes an enum element of a custom type equipped with
355 * \ref alib_enums_records "ALib Enum Records" of type \alib{cli;EROptionDecl}.
356 *
357 * @tparam TEnum C++ enum type equipped with corresponding \alib Enum Records.
358 * @param element The enum element
359 */
360 template<typename TEnum>
361 OptionDecl( TEnum element )
362 : declElement( element )
363 , resourceInfo(element)
364 {
365 // make a copy of the resourced record
366 record= enums::GetRecord(element);
367 }
368
369 /**
370 * Returns the type and integral value of the enumeration element used with construction.
371 * @return The enumeration element used with construction.
372 */
373 const Enum& Element() const
374 {
375 return declElement;
376 }
377
378 /**
379 * Returns the identifier of the option if double hyphen <c>'--'</c> is used.
380 * @return The option identifier.
381 */
383 {
384 return record.EnumElementName;
385 }
386
387 /**
388 * Returns the minimum parse length of the identifier if double hyphen <c>'--'</c> is used.
389 * @return The minimum characters to satisfy the option.
390 */
392 {
393 return record.MinimumRecognitionLength;
394 }
395
396 /**
397 * Returns the identifier of the option if single hyphen <c>'-'</c> is used.
398 * @return The option identifier.
399 */
401 {
402 return record.identifierChar.IsNotEmpty() ? record.identifierChar.CharAtStart()
403 : '\0';
404 }
405
406 /**
407 * An optional separator string (usually "="), that separates the parameter name from a
408 * parameter value.
409 * @return The separator string.
410 */
412 {
413 return record.valueSeparator;
414 }
415
416 /**
417 * The number of CLI arguments to consume and store in \alib{cli;Option::Args} with method
418 * \alib{cli;Option::Read}.
419 * @return The option identifier.
420 */
425
426 /**
427 * If an option is a shortcut to another one, this string replaces the argument given.
428 * @return The option identifier.
429 */
431 {
432 return record.shortcutReplacementString;
433 }
434
435
436 /**
437 * Returns a formal description of the usage.
438 * Loads the string from #resourceInfo using resource name \c "TOptUsgNN",
439 * where \c NN is the enum element's integral value.
440 * @return The help text.
441 */
443 {
444 return resourceInfo.Get( NString64("TOptUsg_" ) << Identifier() ALIB_DBG(, true) );
445 }
446
447 /**
448 * Returns the help text.
449 * Loads the string from #resourceInfo using resource name \c "TOptHlpNN",
450 * where \c NN is the enum element's integral value.
451 * @return The help text.
452 */
454 {
455 return resourceInfo.Get( NString64("TOptHlp_" ) << Identifier() ALIB_DBG(, true) );
456 }
457}; // OptionDecl
458
459/**
460 * An option of a command line. Options are read "automatically" using their declaration
461 * information defined with externalized strings (resources) accessed through
462 * \ref alib_enums_records "ALib Enum Records" associated with enum elements of enum custom types.
463 *
464 * However, such automatic read is limited due to the fact, that the simple values and flags
465 * defined with \alib{cli;OptionDecl}, can not provide the flexibility needed to perfectly
466 * parse options with a complex syntax.
467 *
468 * In this case, the way out is to use custom code that invokes \alib{cli;CommandLine;ReadOptions}
469 * and then processes all options that may have remaining arguments left in the list.
470 * Using field #Position further arguments may be consumed from \alib{cli;CommandLine::ArgsLeft}.<br>
471 * Note, "processing all options" may mean a nested loop. The outer is over the option types
472 * of \alib{cli;CommandLine;OptionsFound}, the inner is over the vector of options per type.
473 *
474 */
475struct Option : public Parsed
476{
477 /** The declaration struct. */
478 OptionDecl* Declaration = nullptr;
479
480 /** Arguments belonging to this option. */
482
483 /**
484 * Constructor
485 * @param cmdLine The command line main object.
486 */
487 inline
488 Option( CommandLine* cmdLine );
489
490 /**
491 * Tries to read the object from the current CLI arg(s).
492 * \note
493 * Unlike the read methods \alib{cli;Command::Read} and \alib{cli;Parameter::Read}, this
494 * method expects the argument to test not only by number with \p{argNo} but as well
495 * with string parameter \p{arg}.<br>
496 * This redundancy is needed to easily implement shortcut options, that just
497 * replace a shortcut option read to another one, probably with a preset argument included.
498 *
499 * @param decl The declaration used for reading.
500 * @param arg The argument string starting with one or two hyphens.
501 * @param argNo The position of reading.
502 * @return The \c true on success, \c false otherwise.
503 */
505 bool Read( OptionDecl& decl, String& arg, const integer argNo );
506};
507
508/**
509 * \ref alib_enums_records "ALib Enum Record" type used by class \alib{cli;CommandDecl}.
510 */
512 {
513 /** List of parameters attached. Separated by <c>'/'</c>. */
515
516 /** Default constructor leaving the record undefined.
517 * (Implementation required as documented
518 * \alib{enums;EnumRecordPrototype::EnumRecordPrototype();here}.) */
519 ERCommandDecl() noexcept = default;
520
521 /** Implementation of \alib{enums;EnumRecordPrototype::Parse}. */
523 void Parse();
524 };
525
526/**
527 * A declaration for a \alib{cli::Command}.
528 *
529 * Construction is done by passing a custom enum element of an enum type equipped with
530 * \ref alib_enums_records "ALib Enum Records" of type \alib{cli;ERCommandDecl}.
531 *
532 * When bootstrapping \alib_cli_nl, method \alib{cli;CommandLine::DefineCommands} has to be
533 * invoked for (each) enum type.
534 *
535 */
537{
538 protected:
539 /** The enumeration element given with construction. */
541
542 /** A copy (!) of the enum record. */
544
545 /** The resource information of the enumeration type given with construction. */
547
548 public :
549 /** The command line instance we belong to. */
551
552 /** Command parameters. */
554
555 /**
556 * Templated constructor which takes an enum element of a custom type equipped with
557 * \ref alib_enums_records "ALib Enum Records" of type \alib{cli;ERCommandDecl}.
558 *
559 * Field #Parameters is filled as specified in the enum record.
560 *
561 * @tparam TEnum C++ enum type equipped with corresponding \alib Enum Records.
562 * @param element The enum element
563 * @param cmdLine The command line object. Will be stored.
564 */
565 template<typename TEnum>
566 inline
567 CommandDecl( TEnum element, CommandLine& cmdLine );
568
569 /**
570 * Returns the type and integral value of the enumeration element used with construction.
571 * @return The enumeration element used with construction.
572 */
573 const Enum& Element() const
574 {
575 return declElement;
576 }
577
578 /**
579 * Returns the identifier (name) of the command
580 * @return The command identifier.
581 */
583 {
584 return record.EnumElementName;
585 }
586
587 /**
588 * Returns the minimum parse length of the identifier.
589 * @return The minimum characters to satisfy the command to be parsed.
590 */
592 {
593 return record.MinimumRecognitionLength;
594 }
595
596 /**
597 * Returns the short version of the help text.
598 * Loads the string from #resourceInfo using resource name \c "THlpCmdShtNN",
599 * where \c NN is the enum element's integral value.
600 * @return The help text.
601 */
603 {
604 return resourceInfo.Get( NString64("THlpCmdSht_" ) << Identifier() ALIB_DBG(, true) );
605 }
606
607 /**
608 * Returns the long version of the help text.
609 * Loads the string from #resourceInfo using resource name \c "THlpCmdLngNN",
610 * where \c NN is the enum element's integral value.
611 * @return The help text.
612 */
614 {
615 return resourceInfo.Get( NString64("THlpCmdLng_" ) << Identifier() ALIB_DBG(, true) );
616 }
617
618 /**
619 * Searches in #Parameters for the declaration of parameter \p{name}.
620 * @param name The declaration name of the parameter.
621 * @return A pointer to the parameter's declaration, \c nullptr if parameter was not
622 * declared.
623 */
625 ParameterDecl* GetParameterDecl(const String& name );
626
627 protected:
628 /**
629 * Called from the constructor. Parses field \alib{cli;ERCommandDecl::parameters} of the
630 * enum record, and loads the corresponding parameters.
631 */
633 void addParamDecls();
634};
635
636/**
637 * A command of a \alib_cli_nl command line.
638 */
639struct Command : public Parsed
640{
641 /** The underlying declaration. */
642 CommandDecl* Declaration = nullptr;
643
644 /** Mandatory parameters parsed. */
646
647 /** Optional parameters parsed. */
649
650 /**
651 * Constructor
652 * @param cmdLine The command line instance.
653 */
654 inline
655 Command( CommandLine* cmdLine );
656
657 /**
658 * Tries to read the object from the front of \alib{cli;CommandLine::ArgsLeft}.
659 * @param decl The declaration used for reading.
660 * @return The \c true on success, \c false otherwise.
661 */
663 bool Read( CommandDecl& decl );
664
665 /**
666 * Searches in #ParametersMandatory and #ParametersOptional for parameter \p{name}.
667 * @param name The declaration name of the parameter.
668 * @return A pointer to the parameter, \c nullptr if parameter was not parsed.
669 */
671 Parameter* GetParsedParameter(const String& name );
672
673 /**
674 * Searches in #ParametersMandatory and #ParametersOptional for parameter \p{name} and returns
675 * its (first) argument.
676 * @param name The declaration name of the parameter.
677 * @return The argument string, \b NullString() if parameter was not parsed if not given.
678 */
680 String GetParsedParameterArg( const String& name );
681};
682
683/**
684 * \ref alib_enums_records "ALib Enum Record" type used by class \alib{cli;ExitCodeDecl}.
685 * \note Field \alib{enums;ERSerializable::MinimumRecognitionLength} is not read from the string,
686 * but set to fixed value \c 0.
687 */
689{
690 /** The CLI module exception associated to this exit code. */
692
693 /** Default constructor leaving the record undefined.
694 * (Implementation required as documented
695 * \alib{enums;EnumRecordPrototype::EnumRecordPrototype();here}.) */
696 ERExitCodeDecl() noexcept
697 : ERSerializable()
698 {}
699
700 /** Implementation of \alib{enums;EnumRecordPrototype::Parse}. */
702 void Parse();
703};
704
705/**
706 * An exit code of a cli application.
707 *
708 * Construction is done by passing a custom enum element of an enum type equipped with
709 * \ref alib_enums_records "ALib Enum Records" of type \alib{cli;ERExitCodeDecl}.
710 *
711 * When bootstrapping \alib_cli_nl, method \alib{cli;CommandLine::DefineExitCodes} has to be
712 * invoked for (each) enum type.
713 *
714 * Announcing the main application's exit codes to the \alib_cli_nl module has two reasons:
715 * - The exit codes are included in the help output text utility methods provided by class
716 * \alib{cli;CommandLine}.
717 * - \alib_cli_nl module exit codes can be translated to valid exit codes using
718 * method \alib{cli;CLIUtil::GetExitCode}.
719 */
721{
722 protected:
723 /** The enumeration element given with construction. */
725
726 /** A copy (!) of the enum record. */
728
729 /** The resource information of the enumeration type given with construction. */
731
732
733 public:
734 /**
735 * Templated constructor which takes an enum element of a custom type equipped with
736 * \ref alib_enums_records "ALib Enum Records" of type \alib{cli;ERExitCodeDecl}.
737 *
738 * @tparam TEnum C++ enum type equipped with corresponding \alib Enum Records.
739 * @param element The enum element.
740 */
741 template<typename TEnum>
742 ExitCodeDecl( TEnum element )
743 : declElement( element )
744 , resourceInfo(element)
745 {
746 // make a copy of the resourced record
747 record= enums::GetRecord(element);
748 }
749
750 /**
751 * Returns the name of the enum element
752 * @return The name of the enum element.
753 */
754 const String& Name()
755 {
756 return record.EnumElementName;
757 }
758
759 /**
760 * If an element of enum type \alib{cli;Exceptions} is associated with this exit code, it
761 * is returned. Otherwise <c>cli::ExitCodes(-1)</c>.
762 *
763 * \see Method \alib{cli;CLIUtil::GetExitCode}.
764 * @return The associated element of cli::Exceptions.
765 */
770
771 /**
772 * Returns the format string associated with this exit code.
773 * Loads the string from #resourceInfo using resource name \c "TExitNN",
774 * where \c NN is the enum element's integral value.
775 * @return The format string.
776 */
778 {
779 return resourceInfo.Get( NString64("TExit" ) << declElement.Integral() ALIB_DBG(, true) );
780 }
781};
782
783}} // namespace [alib::cli]
784
785
786#endif // HPP_ALIB_CLI_ARGUMENTS
CommandLine & CmdLine
const String & Identifier()
const String & HelpTextLong()
const String & HelpTextShort()
List< ParameterDecl * > Parameters
ResourceInfo resourceInfo
const Enum & Element() const
const String & FormatString()
ExitCodeDecl(TEnum element)
ERExitCodeDecl record
ResourceInfo resourceInfo
const String & Name()
cli::Exceptions AssociatedCLIException()
OptionDecl(TEnum element)
const String & Identifier()
const String & ValueSeparator()
const String & ShortcutReplacementString()
character IdentifierChar()
integer QtyExpectedArgsFollowing()
const String & HelpText()
ResourceInfo resourceInfo
const String & HelpUsageLine()
const Enum & Element() const
const String & Identifier()
ERParameterDecl record
const String & GetHelpTextShort()
const String & ValueSeparator()
const String & GetHelpTextLong()
ParameterDecl(TEnum element)
const Enum & Element() const
const String & Name()
constexpr bool IsNotEmpty() const
Definition string.hpp:420
TChar CharAtStart() const
Definition string.hpp:459
#define ALIB_API
Definition alib.hpp:538
#define ALIB_DBG(...)
Definition alib.hpp:457
Exceptions
Definition cli.hpp:73
const T_EnumRecords< TEnum >::Type & GetRecord(TEnum element)
Definition alib.cpp:57
LocalString< 64 > String64
Type alias name for TLocalString<character,64> .
NLocalString< 64 > NString64
Type alias name for TLocalString<nchar,64> .
characters::character character
Type alias in namespace alib.
characters::nchar nchar
Type alias in namespace alib.
lang::integer integer
Type alias in namespace alib.
Definition integers.hpp:286
integer Integral() const
Definition enum.hpp:123
List< Parameter *, Recycling::Shared > ParametersOptional
List< Parameter *, Recycling::Shared > ParametersMandatory
ERCommandDecl() noexcept=default
EROptionDecl() noexcept=default
ERParameterDecl() noexcept=default
List< String, Recycling::Shared > Args
List< String, Recycling::Shared > Args
CommandLine * CmdLine
Definition arguments.hpp:41
Parsed(CommandLine *cmdLine)
Definition arguments.hpp:56
integer QtyArgsConsumed
Definition arguments.hpp:50