188 {
189 const std::string usage = app->get_usage();
190 if (!usage.empty()) {
191 return usage + "\n";
192 }
193
194 std::stringstream out;
195
196 out << get_label("Usage") << ":" << (name.empty() ? "" : " ") << name;
197
198
199 const std::vector<const Option*> non_pos_options = app->get_options([](const Option* opt) {
200 return opt->nonpositional();
201 });
202 if (!non_pos_options.empty()) {
203 out << " [" << get_label("OPTIONS") << "]";
204 }
205
206
207 std::vector<const Option*> positionals = app->get_options([](const Option* opt) {
208 return opt->get_positional();
209 });
210
211
212 if (!positionals.empty()) {
213
214 std::vector<std::string> positional_names(positionals.size());
215 std::transform(positionals.begin(), positionals.end(), positional_names.begin(), [this](const Option* opt) {
216 return make_option_usage(opt);
217 });
218
219 out << " " << detail::join(positional_names, " ");
220 }
221
222
223 if (!app->get_subcommands([](const App* subc) {
224 return !subc->get_disabled() && !subc->get_name().empty();
225 })
226 .empty()) {
227
228 out << " ["
229 << get_label(app->get_subcommands([](const CLI::App* subc) {
230 return ((!subc->get_disabled()) && (!subc->get_name().empty()) );
231 }).size() <= 1
232 ? "SUBCOMMAND"
233 : "SUBCOMMANDS")
234 << " [--help]"
235 << "]";
236 }
237
238 const Option* disabledOpt = app->get_option_no_throw("--disabled");
239 if (disabledOpt != nullptr ? disabledOpt->as<bool>() : false) {
240 out << " " << get_label("DISABLED");
241 } else if (app->get_required()) {
242 out << " " << get_label("REQUIRED");
243 }
244
245 out << std::endl << std::endl;
246
247 return out.str();
248 }