216 {
217 const std::string usage = app->get_usage();
218 if (!usage.empty()) {
219 return usage + "\n";
220 }
221
222 std::stringstream out;
223
224 out << get_label("Usage") << ":" << (name.empty() ? "" : " ") << name;
225
226
227 const std::vector<const Option*> non_pos_options = app->get_options([](const Option* opt) {
228 return opt->nonpositional();
229 });
230 if (!non_pos_options.empty()) {
231 out << " [" << get_label("OPTIONS") << "]";
232 }
233
234
235 std::vector<const Option*> positionals = app->get_options([](const Option* opt) {
236 return opt->get_positional();
237 });
238
239
240 if (!positionals.empty()) {
241
242 std::vector<std::string> positional_names(positionals.size());
243 std::transform(positionals.begin(), positionals.end(), positional_names.begin(), [this](const Option* opt) {
244 return make_option_usage(opt);
245 });
246
247 out << " " << detail::join(positional_names, " ");
248 }
249
250
251 if (!app->get_subcommands([](const App* subc) {
252 return !subc->get_disabled() && !subc->get_name().empty();
253 })
254 .empty()) {
255
256 out << " ["
257 << get_label(app->get_subcommands([](const CLI::App* subc) {
258 return ((!subc->get_disabled()) && (!subc->get_name().empty()) );
259 }).size() <= 1
260 ? "SUBCOMMAND"
261 : "SUBCOMMANDS")
262 << " [--help]"
263 << "]";
264 }
265
266 const Option* disabledOpt = app->get_option_no_throw("--disabled");
267 if (disabledOpt != nullptr ? disabledOpt->as<bool>() : false) {
268 out << " " << get_label("DISABLED");
269 } else if (app->get_required()) {
270 out << " " << get_label("REQUIRED");
271 }
272
273 out << std::endl << std::endl;
274
275 return out.str();
276 }