@@ -58,6 +58,7 @@ namespace steppable::__internals::utils
58
58
59
59
void ProgramArgs::printUsage (const std::string& reason) const
60
60
{
61
+ // Usage: <programName> <switches> <keywordArgs>
61
62
std::cout << $(" argParse" , " 91408f1e-6627-41e5-9707-d8a660c2b86b" ) << formats::bold << programName << reset
62
63
<< " " ;
63
64
@@ -66,13 +67,16 @@ namespace steppable::__internals::utils
66
67
std::cout << colors::brightGreen << ' <' << posArg << ' >' << " " ;
67
68
68
69
if (not switchDescriptions.empty ())
70
+ // Siwtches
69
71
std::cout << colors::brightGreen << $(" argParse" , " 38f61169-17f1-4a49-870b-814745cdf4c6" ) << reset;
70
72
if (not keywordArgDescriptions.empty ())
73
+ // Keyword arguments
71
74
std::cout << colors::brightGreen << $(" argParse" , " 4f332974-1fd1-43eb-bbbc-8d32071ed735" ) << reset;
72
75
std::cout << ' \n ' ;
73
76
74
77
if (not posArgDescriptions.empty ())
75
78
{
79
+ // Available positional arguments
76
80
std::cout << formats::bold << $(" argParse" , " 5d482eea-c4e4-4c4d-89f0-6b33fcc9618c" ) << reset << ' \n ' ;
77
81
for (const auto & [posArgName, posArgDescription] : posArgDescriptions)
78
82
{
@@ -87,18 +91,22 @@ namespace steppable::__internals::utils
87
91
88
92
if (not switchDescriptions.empty ())
89
93
{
94
+ // Available switches
90
95
std::cout << formats::bold << $(" argParse" , " 10b1c33b-070f-4dfb-be12-a1a4349e76bc" ) << reset << ' \n ' ;
91
96
for (const auto & [switchName, switchDescription] : switchDescriptions)
92
97
{
93
98
std::cout << colors::brightGreen << formats::bold << ' [' << ' -' << switchName << " ] " ;
94
99
std::cout << ' [' << ' +' << switchName << " ]" << reset << ' \n ' ;
95
- std::cout << $(" argParse" , " 227375c6-6ec8-479e-ad39-59f975272c6b" ) << switchDescription << ' \n ' ;
100
+
101
+ // Enables/Disables {0}.
102
+ std::cout << $(" argParse" , " 227375c6-6ec8-479e-ad39-59f975272c6b" , { switchDescription }) << ' \n ' ;
96
103
}
97
104
std::cout << reset << ' \n ' ;
98
105
}
99
106
100
107
if (not keywordArgDescriptions.empty ())
101
108
{
109
+ // Available keyword arguments
102
110
std::cout << formats::bold << $(" argParse" , " be2d8c84-0dfc-4f52-b450-e34d1cf20c91" ) << reset << ' \n ' ;
103
111
for (const auto & [keywordArgName, keywordArgDescription] : keywordArgDescriptions)
104
112
{
@@ -117,27 +125,31 @@ namespace steppable::__internals::utils
117
125
118
126
// Print the footnote only if there are positional arguments that require a number
119
127
if (std::ranges::any_of (posArgIsNumber, [](const bool isNumber) { return isNumber; }))
128
+ // Requires number
120
129
std::cout << $(" argParse" , " fd67fddb-ca42-4a79-b852-c0bc71aa9969" ) << " \n " ;
121
130
programSafeExit (-1 );
122
131
}
123
132
124
133
std::string ProgramArgs::getPosArg (const size_t index) const
125
134
{
126
135
if (posArgs.size () <= index)
136
+ // Invalid positional argument
127
137
printUsage ($(" argParse" , " b782de55-513d-4eda-b068-98d2d6210603" ) + std::to_string (index));
128
138
return posArgs[index];
129
139
}
130
140
131
141
int ProgramArgs::getKeywordArgument (const std::string& name)
132
142
{
133
143
if (not keywordArgs.contains (name))
144
+ // Invalid keyword argument
134
145
printUsage ($(" argParse" , " aa26a7f2-0949-454e-b987-42b40348e104" ) + name);
135
146
return keywordArgs[name];
136
147
}
137
148
138
149
bool ProgramArgs::getSwitch (const std::string& name)
139
150
{
140
151
if (not switches.contains (name))
152
+ // Invalid switch
141
153
printUsage ($(" argParse" , " 2b854b9f-da27-483e-a016-0eb0d26eb9e9" ) + name);
142
154
return switches[name];
143
155
}
@@ -177,6 +189,7 @@ namespace steppable::__internals::utils
177
189
{
178
190
if (not numUtils::isNumber (_arg) and posArgIsNumber[posArgs.size ()])
179
191
{
192
+ // Positional argument is not a number.
180
193
output::error (" ProgramArgs::parseArgs" s,
181
194
$(" argParse" , " 34782921-b560-4706-a2c9-d5c326af2cff" , { _arg }));
182
195
programSafeExit (-1 );
0 commit comments