args-parser 6.3.6
Loading...
Searching...
No Matches
api.hpp
Go to the documentation of this file.
1
2/*
3 SPDX-FileCopyrightText: 2026 Igor Mironchik <igor.mironchik@gmail.com>
4 SPDX-License-Identifier: MIT
5*/
6
7#ifndef ARGS__API_HPP__INCLUDED
8#define ARGS__API_HPP__INCLUDED
9
10// Args include.
11#include "arg.hpp"
12#include "command.hpp"
13#include "groups.hpp"
14#include "multi_arg.hpp"
15#include "types.hpp"
16
17namespace Args
18{
19
20namespace details
21{
22
23//
24// API
25//
26
28template<typename PARENT, typename SELF, typename ARGPTR, bool RETPARENT>
29class API
30{
31};
32
33//
34// Specialization for Command.
35//
36
38template<typename PARENT, typename ARGPTR>
39class API<PARENT, Command, ARGPTR, false>
40{
41public:
42 API(PARENT &parent,
43 Command &self)
44 : m_parent(parent)
45 , m_self(self)
46 {
47 }
48
49 virtual ~API()
50 {
51 }
52
54 template<typename NAME>
55 API<API<PARENT,
56 Command,
57 ARGPTR,
58 false>,
60 ARGPTR,
61 false>
64 NAME &&name,
66 bool required = false)
67 {
68 auto group = std::unique_ptr<OnlyOneGroup, details::Deleter<ArgIface>>(
69 new OnlyOneGroup(std::forward<NAME>(name), required),
71
72 OnlyOneGroup &g = *group;
73
74 ARGPTR a = std::move(group);
75
76 m_self.addArg(std::move(a));
77
78 return API<API<PARENT, Command, ARGPTR, false>, OnlyOneGroup, ARGPTR, false>(*this, g);
79 }
80
82 template<typename NAME>
83 API<API<PARENT,
84 Command,
85 ARGPTR,
86 false>,
88 ARGPTR,
89 false>
92 NAME &&name,
94 bool required = false)
95 {
96 auto group =
97 std::unique_ptr<AllOfGroup, details::Deleter<ArgIface>>(new AllOfGroup(std::forward<NAME>(name), required),
99
100 AllOfGroup &g = *group;
101
102 ARGPTR a = std::move(group);
103
104 m_self.addArg(std::move(a));
105
106 return API<API<PARENT, Command, ARGPTR, false>, AllOfGroup, ARGPTR, false>(*this, g);
107 }
108
110 template<typename NAME>
111 API<API<PARENT,
112 Command,
113 ARGPTR,
114 false>,
116 ARGPTR,
117 false>
120 NAME &&name,
122 bool required = false)
123 {
124 auto group = std::unique_ptr<AtLeastOneGroup, details::Deleter<ArgIface>>(
125 new AtLeastOneGroup(std::forward<NAME>(name), required),
127
128 AtLeastOneGroup &g = *group;
129
130 ARGPTR a = std::move(group);
131
132 m_self.addArg(std::move(a));
133
134 return API<API<PARENT, Command, ARGPTR, false>, AtLeastOneGroup, ARGPTR, false>(*this, g);
135 }
136
138 template<typename NAME>
139 API<PARENT,
140 Command,
141 ARGPTR,
142 false> &
145 Char flag,
147 NAME &&name,
149 bool isWithValue = false,
151 bool isRequired = false,
153 const String &desc = String(),
155 const String &longDesc = String(),
157 const String &defaultValue = String(),
159 const String &valueSpecifier = String())
160 {
161 auto arg = std::unique_ptr<Arg, details::Deleter<ArgIface>>(
162 new Arg(flag, std::forward<NAME>(name), isWithValue, isRequired),
164
165 if (!desc.empty()) {
166 arg->setDescription(desc);
167 }
168
169 if (!longDesc.empty()) {
170 arg->setLongDescription(longDesc);
171 }
172
173 if (!defaultValue.empty()) {
174 arg->setDefaultValue(defaultValue);
175 }
176
177 if (!valueSpecifier.empty()) {
178 arg->setValueSpecifier(valueSpecifier);
179 }
180
181 ARGPTR a = std::move(arg);
182
183 m_self.addArg(std::move(a));
184
185 return *this;
186 }
187
189 API<PARENT,
190 Command,
191 ARGPTR,
192 false> &
195 Char flag,
197 bool isWithValue = false,
199 bool isRequired = false,
201 const String &desc = String(),
203 const String &longDesc = String(),
205 const String &defaultValue = String(),
207 const String &valueSpecifier = String())
208 {
209 auto arg = std::unique_ptr<Arg, details::Deleter<ArgIface>>(new Arg(flag, isWithValue, isRequired),
211
212 if (!desc.empty()) {
213 arg->setDescription(desc);
214 }
215
216 if (!longDesc.empty()) {
217 arg->setLongDescription(longDesc);
218 }
219
220 if (!defaultValue.empty()) {
221 arg->setDefaultValue(defaultValue);
222 }
223
224 if (!valueSpecifier.empty()) {
225 arg->setValueSpecifier(valueSpecifier);
226 }
227
228 ARGPTR a = std::move(arg);
229
230 m_self.addArg(std::move(a));
231
232 return *this;
233 }
234
236 template<typename NAME>
237 API<PARENT,
238 Command,
239 ARGPTR,
240 false> &
243 NAME &&name,
245 bool isWithValue = false,
247 bool isRequired = false,
249 const String &desc = String(),
251 const String &longDesc = String(),
253 const String &defaultValue = String(),
255 const String &valueSpecifier = String())
256 {
257 auto arg =
258 std::unique_ptr<Arg, details::Deleter<ArgIface>>(new Arg(std::forward<NAME>(name), isWithValue, isRequired),
260
261 if (!desc.empty()) {
262 arg->setDescription(desc);
263 }
264
265 if (!longDesc.empty()) {
266 arg->setLongDescription(longDesc);
267 }
268
269 if (!defaultValue.empty()) {
270 arg->setDefaultValue(defaultValue);
271 }
272
273 if (!valueSpecifier.empty()) {
274 arg->setValueSpecifier(valueSpecifier);
275 }
276
277 ARGPTR a = std::move(arg);
278
279 m_self.addArg(std::move(a));
280
281 return *this;
282 }
283
285 template<typename NAME>
286 API<PARENT,
287 Command,
288 ARGPTR,
289 false> &
292 Char flag,
294 NAME &&name,
296 bool isWithValue = false,
298 bool isRequired = false,
300 const String &desc = String(),
302 const String &longDesc = String(),
304 const String &defaultValue = String(),
306 const String &valueSpecifier = String())
307 {
308 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
309 new MultiArg(flag, std::forward<NAME>(name), isWithValue, isRequired),
311
312 if (!desc.empty()) {
313 arg->setDescription(desc);
314 }
315
316 if (!longDesc.empty()) {
317 arg->setLongDescription(longDesc);
318 }
319
320 if (!defaultValue.empty()) {
321 arg->setDefaultValue(defaultValue);
322 }
323
324 if (!valueSpecifier.empty()) {
325 arg->setValueSpecifier(valueSpecifier);
326 }
327
328 ARGPTR a = std::move(arg);
329
330 m_self.addArg(std::move(a));
331
332 return *this;
333 }
334
336 API<PARENT,
337 Command,
338 ARGPTR,
339 false> &
342 Char flag,
344 bool isWithValue = false,
346 bool isRequired = false,
348 const String &desc = String(),
350 const String &longDesc = String(),
352 const String &defaultValue = String(),
354 const String &valueSpecifier = String())
355 {
356 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(new MultiArg(flag, isWithValue, isRequired),
358
359 if (!desc.empty()) {
360 arg->setDescription(desc);
361 }
362
363 if (!longDesc.empty()) {
364 arg->setLongDescription(longDesc);
365 }
366
367 if (!defaultValue.empty()) {
368 arg->setDefaultValue(defaultValue);
369 }
370
371 if (!valueSpecifier.empty()) {
372 arg->setValueSpecifier(valueSpecifier);
373 }
374
375 ARGPTR a = std::move(arg);
376
377 m_self.addArg(std::move(a));
378
379 return *this;
380 }
381
383 template<typename NAME>
384 API<PARENT,
385 Command,
386 ARGPTR,
387 false> &
390 NAME &&name,
392 bool isWithValue = false,
394 bool isRequired = false,
396 const String &desc = String(),
398 const String &longDesc = String(),
400 const String &defaultValue = String(),
402 const String &valueSpecifier = String())
403 {
404 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
405 new MultiArg(std::forward<NAME>(name), isWithValue, isRequired),
407
408 if (!desc.empty()) {
409 arg->setDescription(desc);
410 }
411
412 if (!longDesc.empty()) {
413 arg->setLongDescription(longDesc);
414 }
415
416 if (!defaultValue.empty()) {
417 arg->setDefaultValue(defaultValue);
418 }
419
420 if (!valueSpecifier.empty()) {
421 arg->setValueSpecifier(valueSpecifier);
422 }
423
424 ARGPTR a = std::move(arg);
425
426 m_self.addArg(std::move(a));
427
428 return *this;
429 }
430
432 template<typename NAME>
433 API<PARENT,
434 Command,
435 ARGPTR,
436 false> &
439 Char flag,
441 NAME &&name,
443 bool isWithValue = false,
445 bool isRequired = false,
447 const String &desc = String(),
449 const String &longDesc = String(),
451 const StringList &defaultValues = StringList(),
453 const String &valueSpecifier = String())
454 {
455 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
456 new MultiArg(flag, std::forward<NAME>(name), isWithValue, isRequired),
458
459 if (!desc.empty()) {
460 arg->setDescription(desc);
461 }
462
463 if (!longDesc.empty()) {
464 arg->setLongDescription(longDesc);
465 }
466
467 if (!defaultValues.empty()) {
468 arg->setDefaultValues(defaultValues);
469 }
470
471 if (!valueSpecifier.empty()) {
472 arg->setValueSpecifier(valueSpecifier);
473 }
474
475 ARGPTR a = std::move(arg);
476
477 m_self.addArg(std::move(a));
478
479 return *this;
480 }
481
483 API<PARENT,
484 Command,
485 ARGPTR,
486 false> &
489 Char flag,
491 bool isWithValue = false,
493 bool isRequired = false,
495 const String &desc = String(),
497 const String &longDesc = String(),
499 const StringList &defaultValues = StringList(),
501 const String &valueSpecifier = String())
502 {
503 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(new MultiArg(flag, isWithValue, isRequired),
505
506 if (!desc.empty()) {
507 arg->setDescription(desc);
508 }
509
510 if (!longDesc.empty()) {
511 arg->setLongDescription(longDesc);
512 }
513
514 if (!defaultValues.empty()) {
515 arg->setDefaultValues(defaultValues);
516 }
517
518 if (!valueSpecifier.empty()) {
519 arg->setValueSpecifier(valueSpecifier);
520 }
521
522 ARGPTR a = std::move(arg);
523
524 m_self.addArg(std::move(a));
525
526 return *this;
527 }
528
530 template<typename NAME>
531 API<PARENT,
532 Command,
533 ARGPTR,
534 false> &
537 NAME &&name,
539 bool isWithValue = false,
541 bool isRequired = false,
543 const String &desc = String(),
545 const String &longDesc = String(),
547 const StringList &defaultValues = StringList(),
549 const String &valueSpecifier = String())
550 {
551 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
552 new MultiArg(std::forward<NAME>(name), isWithValue, isRequired),
554
555 if (!desc.empty()) {
556 arg->setDescription(desc);
557 }
558
559 if (!longDesc.empty()) {
560 arg->setLongDescription(longDesc);
561 }
562
563 if (!defaultValues.empty()) {
564 arg->setDefaultValues(defaultValues);
565 }
566
567 if (!valueSpecifier.empty()) {
568 arg->setValueSpecifier(valueSpecifier);
569 }
570
571 ARGPTR a = std::move(arg);
572
573 m_self.addArg(std::move(a));
574
575 return *this;
576 }
577
579 API<PARENT,
580 Command,
581 ARGPTR,
582 false> &
584 {
585 m_self.addArg(arg);
586
587 return *this;
588 }
589
591 API<PARENT,
592 Command,
593 ARGPTR,
594 false> &
596 {
597 m_self.addArg(arg);
598
599 return *this;
600 }
601
603 API<PARENT,
604 Command,
605 ARGPTR,
606 false> &
608 {
609 m_self.addArg(std::move(arg));
610
611 return *this;
612 }
613
615 template<typename NAME>
616 API<API<PARENT,
617 Command,
618 ARGPTR,
619 false>,
620 Command,
621 ARGPTR,
622 false>
625 NAME &&name,
629 bool isSubCommandRequired = false,
631 const String &desc = String(),
633 const String &longDesc = String(),
635 const String &defaultValue = String(),
637 const String &valueSpecifier = String())
638 {
639 auto cmd = std::unique_ptr<Command, details::Deleter<ArgIface>>(
640 new Command(std::forward<NAME>(name), opt, isSubCommandRequired),
642
643 if (!desc.empty()) {
644 cmd->setDescription(desc);
645 }
646
647 if (!longDesc.empty()) {
648 cmd->setLongDescription(longDesc);
649 }
650
651 if (!defaultValue.empty()) {
652 cmd->setDefaultValue(defaultValue);
653 }
654
655 if (!valueSpecifier.empty()) {
656 cmd->setValueSpecifier(valueSpecifier);
657 }
658
659 Command &c = *cmd;
660
661 ARGPTR arg = std::move(cmd);
662
663 m_self.addArg(std::move(arg));
664
665 return API<API<PARENT, Command, ARGPTR, false>, Command, ARGPTR, false>(*this, c);
666 }
667
669 template<typename NAME>
670 API<API<PARENT,
671 Command,
672 ARGPTR,
673 false>,
674 Command,
675 ARGPTR,
676 false>
679 NAME &&name,
683 bool isSubCommandRequired = false,
685 const String &desc = String(),
687 const String &longDesc = String(),
689 const StringList &defaultValues = StringList(),
691 const String &valueSpecifier = String())
692 {
693 auto cmd = std::unique_ptr<Command, details::Deleter<ArgIface>>(
694 new Command(std::forward<NAME>(name), opt, isSubCommandRequired),
696
697 if (!desc.empty()) {
698 cmd->setDescription(desc);
699 }
700
701 if (!longDesc.empty()) {
702 cmd->setLongDescription(longDesc);
703 }
704
705 if (!defaultValues.empty()) {
706 cmd->setDefaultValues(defaultValues);
707 }
708
709 if (!valueSpecifier.empty()) {
710 cmd->setValueSpecifier(valueSpecifier);
711 }
712
713 Command &c = *cmd;
714
715 ARGPTR arg = std::move(cmd);
716
717 m_self.addArg(std::move(arg));
718
719 return API<API<PARENT, Command, ARGPTR, false>, Command, ARGPTR, false>(*this, c);
720 }
721
723 PARENT &end() const
724 {
725 return m_parent;
726 }
727
728private:
730 PARENT &m_parent;
732 Command &m_self;
733}; // class API
734
735//
736// Common specialization.
737//
738
740template<typename PARENT, typename SELF, typename ARGPTR>
741class API<PARENT, SELF, ARGPTR, false>
742{
743public:
744 API(PARENT &parent,
745 SELF &self)
746 : m_parent(parent)
747 , m_self(self)
748 {
749 }
750
751 virtual ~API()
752 {
753 }
754
756 template<typename NAME>
757 API<API<PARENT,
758 SELF,
759 ARGPTR,
760 false>,
762 ARGPTR,
763 false>
766 NAME &&name,
768 bool required = false)
769 {
770 auto group = std::unique_ptr<OnlyOneGroup, details::Deleter<ArgIface>>(
771 new OnlyOneGroup(std::forward<NAME>(name), required),
773
774 OnlyOneGroup &g = *group;
775
776 ARGPTR a = std::move(group);
777
778 m_self.addArg(std::move(a));
779
780 return API<API<PARENT, SELF, ARGPTR, false>, OnlyOneGroup, ARGPTR, false>(*this, g);
781 }
782
784 template<typename NAME>
785 API<API<PARENT,
786 SELF,
787 ARGPTR,
788 false>,
790 ARGPTR,
791 false>
794 NAME &&name,
796 bool required = false)
797 {
798 auto group =
799 std::unique_ptr<AllOfGroup, details::Deleter<ArgIface>>(new AllOfGroup(std::forward<NAME>(name), required),
801
802 AllOfGroup &g = *group;
803
804 ARGPTR a = std::move(group);
805
806 m_self.addArg(std::move(a));
807
808 return API<API<PARENT, SELF, ARGPTR, false>, AllOfGroup, ARGPTR, false>(*this, g);
809 }
810
812 template<typename NAME>
813 API<API<PARENT,
814 SELF,
815 ARGPTR,
816 false>,
818 ARGPTR,
819 false>
822 NAME &&name,
824 bool required = false)
825 {
826 auto group = std::unique_ptr<AtLeastOneGroup, details::Deleter<ArgIface>>(
827 new AtLeastOneGroup(std::forward<NAME>(name), required),
829
830 AtLeastOneGroup &g = *group;
831
832 ARGPTR a = std::move(group);
833
834 m_self.addArg(std::move(a));
835
836 return API<API<PARENT, SELF, ARGPTR, false>, AtLeastOneGroup, ARGPTR, false>(*this, g);
837 }
838
840 template<typename NAME>
841 API<PARENT,
842 SELF,
843 ARGPTR,
844 false> &
847 Char flag,
849 NAME &&name,
851 bool isWithValue = false,
853 bool isRequired = false,
855 const String &desc = String(),
857 const String &longDesc = String(),
859 const String &defaultValue = String(),
861 const String &valueSpecifier = String())
862 {
863 auto arg = std::unique_ptr<Arg, details::Deleter<ArgIface>>(
864 new Arg(flag, std::forward<NAME>(name), isWithValue, isRequired),
866
867 if (!desc.empty()) {
868 arg->setDescription(desc);
869 }
870
871 if (!longDesc.empty()) {
872 arg->setLongDescription(longDesc);
873 }
874
875 if (!defaultValue.empty()) {
876 arg->setDefaultValue(defaultValue);
877 }
878
879 if (!valueSpecifier.empty()) {
880 arg->setValueSpecifier(valueSpecifier);
881 }
882
883 ARGPTR a = std::move(arg);
884
885 m_self.addArg(std::move(a));
886
887 return *this;
888 }
889
891 API<PARENT,
892 SELF,
893 ARGPTR,
894 false> &
897 Char flag,
899 bool isWithValue = false,
901 bool isRequired = false,
903 const String &desc = String(),
905 const String &longDesc = String(),
907 const String &defaultValue = String(),
909 const String &valueSpecifier = String())
910 {
911 auto arg = std::unique_ptr<Arg, details::Deleter<ArgIface>>(new Arg(flag, isWithValue, isRequired),
913
914 if (!desc.empty()) {
915 arg->setDescription(desc);
916 }
917
918 if (!longDesc.empty()) {
919 arg->setLongDescription(longDesc);
920 }
921
922 if (!defaultValue.empty()) {
923 arg->setDefaultValue(defaultValue);
924 }
925
926 if (!valueSpecifier.empty()) {
927 arg->setValueSpecifier(valueSpecifier);
928 }
929
930 ARGPTR a = std::move(arg);
931
932 m_self.addArg(std::move(a));
933
934 return *this;
935 }
936
938 template<typename NAME>
939 API<PARENT,
940 SELF,
941 ARGPTR,
942 false> &
945 NAME &&name,
947 bool isWithValue = false,
949 bool isRequired = false,
951 const String &desc = String(),
953 const String &longDesc = String(),
955 const String &defaultValue = String(),
957 const String &valueSpecifier = String())
958 {
959 auto arg =
960 std::unique_ptr<Arg, details::Deleter<ArgIface>>(new Arg(std::forward<NAME>(name), isWithValue, isRequired),
962
963 if (!desc.empty()) {
964 arg->setDescription(desc);
965 }
966
967 if (!longDesc.empty()) {
968 arg->setLongDescription(longDesc);
969 }
970
971 if (!defaultValue.empty()) {
972 arg->setDefaultValue(defaultValue);
973 }
974
975 if (!valueSpecifier.empty()) {
976 arg->setValueSpecifier(valueSpecifier);
977 }
978
979 ARGPTR a = std::move(arg);
980
981 m_self.addArg(std::move(a));
982
983 return *this;
984 }
985
987 template<typename NAME>
988 API<PARENT,
989 SELF,
990 ARGPTR,
991 false> &
994 Char flag,
996 NAME &&name,
998 bool isWithValue = false,
1000 bool isRequired = false,
1002 const String &desc = String(),
1004 const String &longDesc = String(),
1006 const String &defaultValue = String(),
1008 const String &valueSpecifier = String())
1009 {
1010 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
1011 new MultiArg(flag, std::forward<NAME>(name), isWithValue, isRequired),
1013
1014 if (!desc.empty()) {
1015 arg->setDescription(desc);
1016 }
1017
1018 if (!longDesc.empty()) {
1019 arg->setLongDescription(longDesc);
1020 }
1021
1022 if (!defaultValue.empty()) {
1023 arg->setDefaultValue(defaultValue);
1024 }
1025
1026 if (!valueSpecifier.empty()) {
1027 arg->setValueSpecifier(valueSpecifier);
1028 }
1029
1030 ARGPTR a = std::move(arg);
1031
1032 m_self.addArg(std::move(a));
1033
1034 return *this;
1035 }
1036
1038 API<PARENT,
1039 SELF,
1040 ARGPTR,
1041 false> &
1044 Char flag,
1046 bool isWithValue = false,
1048 bool isRequired = false,
1050 const String &desc = String(),
1052 const String &longDesc = String(),
1054 const String &defaultValue = String(),
1056 const String &valueSpecifier = String())
1057 {
1058 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(new MultiArg(flag, isWithValue, isRequired),
1060
1061 if (!desc.empty()) {
1062 arg->setDescription(desc);
1063 }
1064
1065 if (!longDesc.empty()) {
1066 arg->setLongDescription(longDesc);
1067 }
1068
1069 if (!defaultValue.empty()) {
1070 arg->setDefaultValue(defaultValue);
1071 }
1072
1073 if (!valueSpecifier.empty()) {
1074 arg->setValueSpecifier(valueSpecifier);
1075 }
1076
1077 ARGPTR a = std::move(arg);
1078
1079 m_self.addArg(std::move(a));
1080
1081 return *this;
1082 }
1083
1085 template<typename NAME>
1086 API<PARENT,
1087 SELF,
1088 ARGPTR,
1089 false> &
1092 NAME &&name,
1094 bool isWithValue = false,
1096 bool isRequired = false,
1098 const String &desc = String(),
1100 const String &longDesc = String(),
1102 const String &defaultValue = String(),
1104 const String &valueSpecifier = String())
1105 {
1106 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
1107 new MultiArg(std::forward<NAME>(name), isWithValue, isRequired),
1109
1110 if (!desc.empty()) {
1111 arg->setDescription(desc);
1112 }
1113
1114 if (!longDesc.empty()) {
1115 arg->setLongDescription(longDesc);
1116 }
1117
1118 if (!defaultValue.empty()) {
1119 arg->setDefaultValue(defaultValue);
1120 }
1121
1122 if (!valueSpecifier.empty()) {
1123 arg->setValueSpecifier(valueSpecifier);
1124 }
1125
1126 ARGPTR a = std::move(arg);
1127
1128 m_self.addArg(std::move(a));
1129
1130 return *this;
1131 }
1132
1134 template<typename NAME>
1135 API<PARENT,
1136 SELF,
1137 ARGPTR,
1138 false> &
1141 Char flag,
1143 NAME &&name,
1145 bool isWithValue = false,
1147 bool isRequired = false,
1149 const String &desc = String(),
1151 const String &longDesc = String(),
1153 const StringList &defaultValues = StringList(),
1155 const String &valueSpecifier = String())
1156 {
1157 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
1158 new MultiArg(flag, std::forward<NAME>(name), isWithValue, isRequired),
1160
1161 if (!desc.empty()) {
1162 arg->setDescription(desc);
1163 }
1164
1165 if (!longDesc.empty()) {
1166 arg->setLongDescription(longDesc);
1167 }
1168
1169 if (!defaultValues.empty()) {
1170 arg->setDefaultValues(defaultValues);
1171 }
1172
1173 if (!valueSpecifier.empty()) {
1174 arg->setValueSpecifier(valueSpecifier);
1175 }
1176
1177 ARGPTR a = std::move(arg);
1178
1179 m_self.addArg(std::move(a));
1180
1181 return *this;
1182 }
1183
1185 API<PARENT,
1186 SELF,
1187 ARGPTR,
1188 false> &
1191 Char flag,
1193 bool isWithValue = false,
1195 bool isRequired = false,
1197 const String &desc = String(),
1199 const String &longDesc = String(),
1201 const StringList &defaultValues = StringList(),
1203 const String &valueSpecifier = String())
1204 {
1205 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(new MultiArg(flag, isWithValue, isRequired),
1207
1208 if (!desc.empty()) {
1209 arg->setDescription(desc);
1210 }
1211
1212 if (!longDesc.empty()) {
1213 arg->setLongDescription(longDesc);
1214 }
1215
1216 if (!defaultValues.empty()) {
1217 arg->setDefaultValues(defaultValues);
1218 }
1219
1220 if (!valueSpecifier.empty()) {
1221 arg->setValueSpecifier(valueSpecifier);
1222 }
1223
1224 ARGPTR a = std::move(arg);
1225
1226 m_self.addArg(std::move(a));
1227
1228 return *this;
1229 }
1230
1232 template<typename NAME>
1233 API<PARENT,
1234 SELF,
1235 ARGPTR,
1236 false> &
1239 NAME &&name,
1241 bool isWithValue = false,
1243 bool isRequired = false,
1245 const String &desc = String(),
1247 const String &longDesc = String(),
1249 const StringList &defaultValues = StringList(),
1251 const String &valueSpecifier = String())
1252 {
1253 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
1254 new MultiArg(std::forward<NAME>(name), isWithValue, isRequired),
1256
1257 if (!desc.empty()) {
1258 arg->setDescription(desc);
1259 }
1260
1261 if (!longDesc.empty()) {
1262 arg->setLongDescription(longDesc);
1263 }
1264
1265 if (!defaultValues.empty()) {
1266 arg->setDefaultValues(defaultValues);
1267 }
1268
1269 if (!valueSpecifier.empty()) {
1270 arg->setValueSpecifier(valueSpecifier);
1271 }
1272
1273 ARGPTR a = std::move(arg);
1274
1275 m_self.addArg(std::move(a));
1276
1277 return *this;
1278 }
1279
1281 API<PARENT,
1282 SELF,
1283 ARGPTR,
1284 false> &
1286 {
1287 m_self.addArg(arg);
1288
1289 return *this;
1290 }
1291
1293 API<PARENT,
1294 SELF,
1295 ARGPTR,
1296 false> &
1298 {
1299 m_self.addArg(arg);
1300
1301 return *this;
1302 }
1303
1305 API<PARENT,
1306 SELF,
1307 ARGPTR,
1308 false> &
1310 {
1311 m_self.addArg(std::move(arg));
1312
1313 return *this;
1314 }
1315
1317 template<typename NAME>
1318 API<API<PARENT,
1319 SELF,
1320 ARGPTR,
1321 false>,
1322 Command,
1323 ARGPTR,
1324 false>
1327 NAME &&name,
1331 bool isSubCommandRequired = false,
1333 const String &desc = String(),
1335 const String &longDesc = String(),
1337 const String &defaultValue = String(),
1339 const String &valueSpecifier = String())
1340 {
1341 auto cmd = std::unique_ptr<Command, details::Deleter<ArgIface>>(
1342 new Command(std::forward<NAME>(name), opt, isSubCommandRequired),
1344
1345 if (!desc.empty()) {
1346 cmd->setDescription(desc);
1347 }
1348
1349 if (!longDesc.empty()) {
1350 cmd->setLongDescription(longDesc);
1351 }
1352
1353 if (!defaultValue.empty()) {
1354 cmd->setDefaultValue(defaultValue);
1355 }
1356
1357 if (!valueSpecifier.empty()) {
1358 cmd->setValueSpecifier(valueSpecifier);
1359 }
1360
1361 Command &c = *cmd;
1362
1363 ARGPTR arg = std::move(cmd);
1364
1365 m_self.addArg(std::move(arg));
1366
1367 return API<API<PARENT, SELF, ARGPTR, false>, Command, ARGPTR, false>(*this, c);
1368 }
1369
1371 template<typename NAME>
1372 API<API<PARENT,
1373 SELF,
1374 ARGPTR,
1375 false>,
1376 Command,
1377 ARGPTR,
1378 false>
1381 NAME &&name,
1385 bool isSubCommandRequired = false,
1387 const String &desc = String(),
1389 const String &longDesc = String(),
1391 const StringList &defaultValues = StringList(),
1393 const String &valueSpecifier = String())
1394 {
1395 auto cmd = std::unique_ptr<Command, details::Deleter<ArgIface>>(
1396 new Command(std::forward<NAME>(name), opt, isSubCommandRequired),
1398
1399 if (!desc.empty()) {
1400 cmd->setDescription(desc);
1401 }
1402
1403 if (!longDesc.empty()) {
1404 cmd->setLongDescription(longDesc);
1405 }
1406
1407 if (!defaultValues.empty()) {
1408 cmd->setDefaultValues(defaultValues);
1409 }
1410
1411 if (!valueSpecifier.empty()) {
1412 cmd->setValueSpecifier(valueSpecifier);
1413 }
1414
1415 Command &c = *cmd;
1416
1417 ARGPTR arg = std::move(cmd);
1418
1419 m_self.addArg(std::move(arg));
1420
1421 return API<API<PARENT, SELF, ARGPTR, false>, Command, ARGPTR, false>(*this, c);
1422 }
1423
1425 PARENT &end() const
1426 {
1427 return m_parent;
1428 }
1429
1430private:
1432 PARENT &m_parent;
1434 SELF &m_self;
1435}; // class API
1436
1437//
1438// Specialization for CmdLine.
1439//
1440
1442template<typename PARENT, typename SELF, typename ARGPTR>
1443class API<PARENT, SELF, ARGPTR, true>
1444{
1445public:
1446 API(PARENT &parent,
1447 SELF &self)
1448 : m_parent(parent)
1449 , m_self(self)
1450 {
1451 }
1452
1453 virtual ~API()
1454 {
1455 }
1456
1458 template<typename NAME>
1459 API<PARENT,
1461 ARGPTR,
1462 false>
1465 NAME &&name,
1467 bool required = false)
1468 {
1469 auto group = std::unique_ptr<OnlyOneGroup, details::Deleter<ArgIface>>(
1470 new OnlyOneGroup(std::forward<NAME>(name), required),
1472
1473 OnlyOneGroup &g = *group;
1474
1475 ARGPTR a = std::move(group);
1476
1477 m_self.addArg(std::move(a));
1478
1479 return API<PARENT, OnlyOneGroup, ARGPTR, false>(*(static_cast<PARENT *>(this)), g);
1480 }
1481
1483 template<typename NAME>
1484 API<PARENT,
1485 AllOfGroup,
1486 ARGPTR,
1487 false>
1490 NAME &&name,
1492 bool required = false)
1493 {
1494 auto group =
1495 std::unique_ptr<AllOfGroup, details::Deleter<ArgIface>>(new AllOfGroup(std::forward<NAME>(name), required),
1497
1498 AllOfGroup &g = *group;
1499
1500 ARGPTR a = std::move(group);
1501
1502 m_self.addArg(std::move(a));
1503
1504 return API<PARENT, AllOfGroup, ARGPTR, false>(*(static_cast<PARENT *>(this)), g);
1505 }
1506
1508 template<typename NAME>
1509 API<PARENT,
1511 ARGPTR,
1512 false>
1515 NAME &&name,
1517 bool required = false)
1518 {
1519 auto group = std::unique_ptr<AtLeastOneGroup, details::Deleter<ArgIface>>(
1520 new AtLeastOneGroup(std::forward<NAME>(name), required),
1522
1523 AtLeastOneGroup &g = *group;
1524
1525 ARGPTR a = std::move(group);
1526
1527 m_self.addArg(std::move(a));
1528
1529 return API<PARENT, AtLeastOneGroup, ARGPTR, false>(*(static_cast<PARENT *>(this)), g);
1530 }
1531
1533 template<typename NAME>
1536 Char flag,
1538 NAME &&name,
1540 bool isWithValue = false,
1542 bool isRequired = false,
1544 const String &desc = String(),
1546 const String &longDesc = String(),
1548 const String &defaultValue = String(),
1550 const String &valueSpecifier = String())
1551 {
1552 auto arg = std::unique_ptr<Arg, details::Deleter<ArgIface>>(
1553 new Arg(flag, std::forward<NAME>(name), isWithValue, isRequired),
1555
1556 if (!desc.empty()) {
1557 arg->setDescription(desc);
1558 }
1559
1560 if (!longDesc.empty()) {
1561 arg->setLongDescription(longDesc);
1562 }
1563
1564 if (!defaultValue.empty()) {
1565 arg->setDefaultValue(defaultValue);
1566 }
1567
1568 if (!valueSpecifier.empty()) {
1569 arg->setValueSpecifier(valueSpecifier);
1570 }
1571
1572 ARGPTR a = std::move(arg);
1573
1574 m_self.addArg(std::move(a));
1575
1576 return m_parent;
1577 }
1578
1582 Char flag,
1584 bool isWithValue = false,
1586 bool isRequired = false,
1588 const String &desc = String(),
1590 const String &longDesc = String(),
1592 const String &defaultValue = String(),
1594 const String &valueSpecifier = String())
1595 {
1596 auto arg = std::unique_ptr<Arg, details::Deleter<ArgIface>>(new Arg(flag, isWithValue, isRequired),
1598
1599 if (!desc.empty()) {
1600 arg->setDescription(desc);
1601 }
1602
1603 if (!longDesc.empty()) {
1604 arg->setLongDescription(longDesc);
1605 }
1606
1607 if (!defaultValue.empty()) {
1608 arg->setDefaultValue(defaultValue);
1609 }
1610
1611 if (!valueSpecifier.empty()) {
1612 arg->setValueSpecifier(valueSpecifier);
1613 }
1614
1615 ARGPTR a = std::move(arg);
1616
1617 m_self.addArg(std::move(a));
1618
1619 return m_parent;
1620 }
1621
1623 template<typename NAME>
1626 NAME &&name,
1628 bool isWithValue = false,
1630 bool isRequired = false,
1632 const String &desc = String(),
1634 const String &longDesc = String(),
1636 const String &defaultValue = String(),
1638 const String &valueSpecifier = String())
1639 {
1640 auto arg =
1641 std::unique_ptr<Arg, details::Deleter<ArgIface>>(new Arg(std::forward<NAME>(name), isWithValue, isRequired),
1643
1644 if (!desc.empty()) {
1645 arg->setDescription(desc);
1646 }
1647
1648 if (!longDesc.empty()) {
1649 arg->setLongDescription(longDesc);
1650 }
1651
1652 if (!defaultValue.empty()) {
1653 arg->setDefaultValue(defaultValue);
1654 }
1655
1656 if (!valueSpecifier.empty()) {
1657 arg->setValueSpecifier(valueSpecifier);
1658 }
1659
1660 ARGPTR a = std::move(arg);
1661
1662 m_self.addArg(std::move(a));
1663
1664 return m_parent;
1665 }
1666
1668 template<typename NAME>
1671 Char flag,
1673 NAME &&name,
1675 bool isWithValue = false,
1677 bool isRequired = false,
1679 const String &desc = String(),
1681 const String &longDesc = String(),
1683 const String &defaultValue = String(),
1685 const String &valueSpecifier = String())
1686 {
1687 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
1688 new MultiArg(flag, std::forward<NAME>(name), isWithValue, isRequired),
1690
1691 if (!desc.empty()) {
1692 arg->setDescription(desc);
1693 }
1694
1695 if (!longDesc.empty()) {
1696 arg->setLongDescription(longDesc);
1697 }
1698
1699 if (!defaultValue.empty()) {
1700 arg->setDefaultValue(defaultValue);
1701 }
1702
1703 if (!valueSpecifier.empty()) {
1704 arg->setValueSpecifier(valueSpecifier);
1705 }
1706
1707 ARGPTR a = std::move(arg);
1708
1709 m_self.addArg(std::move(a));
1710
1711 return m_parent;
1712 }
1713
1717 Char flag,
1719 bool isWithValue = false,
1721 bool isRequired = false,
1723 const String &desc = String(),
1725 const String &longDesc = String(),
1727 const String &defaultValue = String(),
1729 const String &valueSpecifier = String())
1730 {
1731 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(new MultiArg(flag, isWithValue, isRequired),
1733
1734 if (!desc.empty()) {
1735 arg->setDescription(desc);
1736 }
1737
1738 if (!longDesc.empty()) {
1739 arg->setLongDescription(longDesc);
1740 }
1741
1742 if (!defaultValue.empty()) {
1743 arg->setDefaultValue(defaultValue);
1744 }
1745
1746 if (!valueSpecifier.empty()) {
1747 arg->setValueSpecifier(valueSpecifier);
1748 }
1749
1750 ARGPTR a = std::move(arg);
1751
1752 m_self.addArg(std::move(a));
1753
1754 return m_parent;
1755 }
1756
1758 template<typename NAME>
1761 NAME &&name,
1763 bool isWithValue = false,
1765 bool isRequired = false,
1767 const String &desc = String(),
1769 const String &longDesc = String(),
1771 const String &defaultValue = String(),
1773 const String &valueSpecifier = String())
1774 {
1775 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
1776 new MultiArg(std::forward<NAME>(name), isWithValue, isRequired),
1778
1779 if (!desc.empty()) {
1780 arg->setDescription(desc);
1781 }
1782
1783 if (!longDesc.empty()) {
1784 arg->setLongDescription(longDesc);
1785 }
1786
1787 if (!defaultValue.empty()) {
1788 arg->setDefaultValue(defaultValue);
1789 }
1790
1791 if (!valueSpecifier.empty()) {
1792 arg->setValueSpecifier(valueSpecifier);
1793 }
1794
1795 ARGPTR a = std::move(arg);
1796
1797 m_self.addArg(std::move(a));
1798
1799 return m_parent;
1800 }
1801
1803 template<typename NAME>
1806 Char flag,
1808 NAME &&name,
1810 bool isWithValue = false,
1812 bool isRequired = false,
1814 const String &desc = String(),
1816 const String &longDesc = String(),
1818 const StringList &defaultValues = StringList(),
1820 const String &valueSpecifier = String())
1821 {
1822 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
1823 new MultiArg(flag, std::forward<NAME>(name), isWithValue, isRequired),
1825
1826 if (!desc.empty()) {
1827 arg->setDescription(desc);
1828 }
1829
1830 if (!longDesc.empty()) {
1831 arg->setLongDescription(longDesc);
1832 }
1833
1834 if (!defaultValues.empty()) {
1835 arg->setDefaultValues(defaultValues);
1836 }
1837
1838 if (!valueSpecifier.empty()) {
1839 arg->setValueSpecifier(valueSpecifier);
1840 }
1841
1842 ARGPTR a = std::move(arg);
1843
1844 m_self.addArg(std::move(a));
1845
1846 return m_parent;
1847 }
1848
1852 Char flag,
1854 bool isWithValue = false,
1856 bool isRequired = false,
1858 const String &desc = String(),
1860 const String &longDesc = String(),
1862 const StringList &defaultValues = StringList(),
1864 const String &valueSpecifier = String())
1865 {
1866 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(new MultiArg(flag, isWithValue, isRequired),
1868
1869 if (!desc.empty()) {
1870 arg->setDescription(desc);
1871 }
1872
1873 if (!longDesc.empty()) {
1874 arg->setLongDescription(longDesc);
1875 }
1876
1877 if (!defaultValues.empty()) {
1878 arg->setDefaultValues(defaultValues);
1879 }
1880
1881 if (!valueSpecifier.empty()) {
1882 arg->setValueSpecifier(valueSpecifier);
1883 }
1884
1885 ARGPTR a = std::move(arg);
1886
1887 m_self.addArg(std::move(a));
1888
1889 return m_parent;
1890 }
1891
1893 template<typename NAME>
1896 NAME &&name,
1898 bool isWithValue = false,
1900 bool isRequired = false,
1902 const String &desc = String(),
1904 const String &longDesc = String(),
1906 const StringList &defaultValues = StringList(),
1908 const String &valueSpecifier = String())
1909 {
1910 auto arg = std::unique_ptr<MultiArg, details::Deleter<ArgIface>>(
1911 new MultiArg(std::forward<NAME>(name), isWithValue, isRequired),
1913
1914 if (!desc.empty()) {
1915 arg->setDescription(desc);
1916 }
1917
1918 if (!longDesc.empty()) {
1919 arg->setLongDescription(longDesc);
1920 }
1921
1922 if (!defaultValues.empty()) {
1923 arg->setDefaultValues(defaultValues);
1924 }
1925
1926 if (!valueSpecifier.empty()) {
1927 arg->setValueSpecifier(valueSpecifier);
1928 }
1929
1930 ARGPTR a = std::move(arg);
1931
1932 m_self.addArg(std::move(a));
1933
1934 return m_parent;
1935 }
1936
1938 template<typename NAME>
1939 API<PARENT,
1940 Command,
1941 ARGPTR,
1942 false>
1945 NAME &&name,
1949 bool isSubCommandRequired = false,
1951 const String &desc = String(),
1953 const String &longDesc = String(),
1955 const String &defaultValue = String(),
1957 const String &valueSpecifier = String())
1958 {
1959 auto cmd = std::unique_ptr<Command, details::Deleter<ArgIface>>(
1960 new Command(std::forward<NAME>(name), opt, isSubCommandRequired),
1962
1963 if (!desc.empty()) {
1964 cmd->setDescription(desc);
1965 }
1966
1967 if (!longDesc.empty()) {
1968 cmd->setLongDescription(longDesc);
1969 }
1970
1971 if (!defaultValue.empty()) {
1972 cmd->setDefaultValue(defaultValue);
1973 }
1974
1975 if (!valueSpecifier.empty()) {
1976 cmd->setValueSpecifier(valueSpecifier);
1977 }
1978
1979 Command &c = *cmd;
1980
1981 ARGPTR arg = std::move(cmd);
1982
1983 m_self.addArg(std::move(arg));
1984
1985 return API<PARENT, Command, ARGPTR, false>(m_self, c);
1986 }
1987
1989 template<typename NAME>
1990 API<PARENT,
1991 Command,
1992 ARGPTR,
1993 false>
1996 NAME &&name,
2000 bool isSubCommandRequired = false,
2002 const String &desc = String(),
2004 const String &longDesc = String(),
2006 const StringList &defaultValues = StringList(),
2008 const String &valueSpecifier = String())
2009 {
2010 auto cmd = std::unique_ptr<Command, details::Deleter<ArgIface>>(
2011 new Command(std::forward<NAME>(name), opt, isSubCommandRequired),
2013
2014 if (!desc.empty()) {
2015 cmd->setDescription(desc);
2016 }
2017
2018 if (!longDesc.empty()) {
2019 cmd->setLongDescription(longDesc);
2020 }
2021
2022 if (!defaultValues.empty()) {
2023 cmd->setDefaultValues(defaultValues);
2024 }
2025
2026 if (!valueSpecifier.empty()) {
2027 cmd->setValueSpecifier(valueSpecifier);
2028 }
2029
2030 Command &c = *cmd;
2031
2032 ARGPTR arg = std::move(cmd);
2033
2034 m_self.addArg(std::move(arg));
2035
2036 return API<PARENT, Command, ARGPTR, false>(m_self, c);
2037 }
2038
2039private:
2041 PARENT &m_parent;
2043 SELF &m_self;
2044}; // class API
2045
2046} /* namespace details */
2047
2048} /* namespace Args */
2049
2050#endif // ARGS__API_HPP__INCLUDED
Group of args where all arguments should be defined.
Definition groups.hpp:119
Interface for arguments.
Definition arg_iface.hpp:29
Group of args where at least one argument should be defined.
Definition groups.hpp:202
Command in the command line interface.
Definition command.hpp:28
std::unique_ptr< ArgIface, details::Deleter< ArgIface > > ArgPtr
Smart pointer to the argument.
Group of args where only one argument can be defined.
Definition groups.hpp:32
API< PARENT, Command, ARGPTR, false > & addArg(ArgIface *arg)
Add argument.
Definition api.hpp:595
API< API< PARENT, Command, ARGPTR, false >, AllOfGroup, ARGPTR, false > addAllOfGroup(NAME &&name, bool required=false)
Add AllOfGroup.
Definition api.hpp:90
API< PARENT, Command, ARGPTR, false > & addMultiArgWithFlagOnlyAndDefaultValues(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument with flag only.
Definition api.hpp:487
PARENT & end() const
End this group.
Definition api.hpp:723
API< PARENT, Command, ARGPTR, false > & addMultiArg(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument.
Definition api.hpp:290
API< PARENT, Command, ARGPTR, false > & addArgWithNameOnly(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument with name only.
Definition api.hpp:241
API< API< PARENT, Command, ARGPTR, false >, OnlyOneGroup, ARGPTR, false > addOnlyOneGroup(NAME &&name, bool required=false)
Add OnlyOneGroup.
Definition api.hpp:62
API< PARENT, Command, ARGPTR, false > & addMultiArgWithNameOnlyAndDefaultValues(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument with name only.
Definition api.hpp:535
API(PARENT &parent, Command &self)
Definition api.hpp:42
API< PARENT, Command, ARGPTR, false > & addMultiArgWithFlagOnly(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument with flag only.
Definition api.hpp:340
API< PARENT, Command, ARGPTR, false > & addArgWithFlagOnly(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument with flag only.
Definition api.hpp:193
API< PARENT, Command, ARGPTR, false > & addMultiArgWithDefaulValues(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument.
Definition api.hpp:437
API< API< PARENT, Command, ARGPTR, false >, AtLeastOneGroup, ARGPTR, false > addAtLeastOneGroup(NAME &&name, bool required=false)
Add AtLeastOneGroup.
Definition api.hpp:118
API< PARENT, Command, ARGPTR, false > & addMultiArgWithNameOnly(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument with name only.
Definition api.hpp:388
API< PARENT, Command, ARGPTR, false > & addArg(GroupIface::ArgPtr arg)
Add argument.
Definition api.hpp:607
API< API< PARENT, Command, ARGPTR, false >, Command, ARGPTR, false > addCommandWithDefaultValues(NAME &&name, ValueOptions opt=ValueOptions::NoValue, bool isSubCommandRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add Command.
Definition api.hpp:677
API< PARENT, Command, ARGPTR, false > & addArgWithFlagAndName(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument.
Definition api.hpp:143
API< API< PARENT, Command, ARGPTR, false >, Command, ARGPTR, false > addCommand(NAME &&name, ValueOptions opt=ValueOptions::NoValue, bool isSubCommandRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add Command.
Definition api.hpp:623
API< PARENT, Command, ARGPTR, false > & addArg(ArgIface &arg)
Add argument.
Definition api.hpp:583
API< PARENT, SELF, ARGPTR, false > & addArg(ArgIface &arg)
Add argument.
Definition api.hpp:1285
API< PARENT, SELF, ARGPTR, false > & addMultiArgWithNameOnlyAndDefaultValues(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument with name only.
Definition api.hpp:1237
API< API< PARENT, SELF, ARGPTR, false >, Command, ARGPTR, false > addCommandWithDefaultValues(NAME &&name, ValueOptions opt=ValueOptions::NoValue, bool isSubCommandRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add Command.
Definition api.hpp:1379
API< API< PARENT, SELF, ARGPTR, false >, Command, ARGPTR, false > addCommand(NAME &&name, ValueOptions opt=ValueOptions::NoValue, bool isSubCommandRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add Command.
Definition api.hpp:1325
API< PARENT, SELF, ARGPTR, false > & addMultiArgWithDefaulValues(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument.
Definition api.hpp:1139
API< PARENT, SELF, ARGPTR, false > & addArg(ArgIface *arg)
Add argument.
Definition api.hpp:1297
API< API< PARENT, SELF, ARGPTR, false >, AtLeastOneGroup, ARGPTR, false > addAtLeastOneGroup(NAME &&name, bool required=false)
Add AtLeastOneGroup.
Definition api.hpp:820
API< API< PARENT, SELF, ARGPTR, false >, OnlyOneGroup, ARGPTR, false > addOnlyOneGroup(NAME &&name, bool required=false)
Add OnlyOneGroup.
Definition api.hpp:764
API< PARENT, SELF, ARGPTR, false > & addMultiArgWithFlagOnly(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument with flag only.
Definition api.hpp:1042
API< PARENT, SELF, ARGPTR, false > & addArgWithFlagOnly(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument with flag only.
Definition api.hpp:895
API< PARENT, SELF, ARGPTR, false > & addMultiArgWithFlagOnlyAndDefaultValues(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument with flag only.
Definition api.hpp:1189
API< PARENT, SELF, ARGPTR, false > & addArgWithNameOnly(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument with name only.
Definition api.hpp:943
API< PARENT, SELF, ARGPTR, false > & addArg(GroupIface::ArgPtr arg)
Add argument.
Definition api.hpp:1309
API< PARENT, SELF, ARGPTR, false > & addArgWithFlagAndName(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument.
Definition api.hpp:845
API< API< PARENT, SELF, ARGPTR, false >, AllOfGroup, ARGPTR, false > addAllOfGroup(NAME &&name, bool required=false)
Add AllOfGroup.
Definition api.hpp:792
API< PARENT, SELF, ARGPTR, false > & addMultiArg(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument.
Definition api.hpp:992
API< PARENT, SELF, ARGPTR, false > & addMultiArgWithNameOnly(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument with name only.
Definition api.hpp:1090
PARENT & end() const
End this group.
Definition api.hpp:1425
PARENT & addMultiArgWithNameOnlyAndDefaultValues(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument with name only.
Definition api.hpp:1894
PARENT & addArgWithFlagOnly(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument with flag only.
Definition api.hpp:1580
PARENT & addMultiArgWithNameOnly(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument with name only.
Definition api.hpp:1759
API< PARENT, AtLeastOneGroup, ARGPTR, false > addAtLeastOneGroup(NAME &&name, bool required=false)
Add AtLeastOneGroup.
Definition api.hpp:1513
PARENT & addArgWithFlagAndName(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument.
Definition api.hpp:1534
API< PARENT, AllOfGroup, ARGPTR, false > addAllOfGroup(NAME &&name, bool required=false)
Add AllOfGroup.
Definition api.hpp:1488
API< PARENT, Command, ARGPTR, false > addCommandWithDefaultValues(NAME &&name, ValueOptions opt=ValueOptions::NoValue, bool isSubCommandRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add Command.
Definition api.hpp:1994
API< PARENT, OnlyOneGroup, ARGPTR, false > addOnlyOneGroup(NAME &&name, bool required=false)
Add OnlyOneGroup.
Definition api.hpp:1463
PARENT & addMultiArgWithFlagOnlyAndDefaultValues(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument with flag only.
Definition api.hpp:1850
PARENT & addArgWithNameOnly(NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add argument with name only.
Definition api.hpp:1624
API< PARENT, Command, ARGPTR, false > addCommand(NAME &&name, ValueOptions opt=ValueOptions::NoValue, bool isSubCommandRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add Command.
Definition api.hpp:1943
PARENT & addMultiArg(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument.
Definition api.hpp:1669
PARENT & addMultiArgWithFlagOnly(Char flag, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const String &defaultValue=String(), const String &valueSpecifier=String())
Add multi argument with flag only.
Definition api.hpp:1715
PARENT & addMultiArgWithDefaulValues(Char flag, NAME &&name, bool isWithValue=false, bool isRequired=false, const String &desc=String(), const String &longDesc=String(), const StringList &defaultValues=StringList(), const String &valueSpecifier=String())
Add multi argument.
Definition api.hpp:1804
Auxiliary API.
Definition api.hpp:30
Definition api.hpp:18
std::string String
String type.
Definition types.hpp:314
@ AllOfGroup
"All of" group.
Definition enums.hpp:42
@ Arg
Argument.
Definition enums.hpp:36
@ MultiArg
Multi argument.
Definition enums.hpp:38
@ AtLeastOneGroup
"At least one" group.
Definition enums.hpp:44
@ OnlyOneGroup
"Only one" group.
Definition enums.hpp:40
@ Command
Command.
Definition enums.hpp:34
String::value_type Char
Char type.
Definition types.hpp:317
ValueOptions
Options for value property.
Definition enums.hpp:18
@ NoValue
No values.
Definition enums.hpp:20
std::vector< String > StringList
List of strings.
Definition types.hpp:336