2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   44#ifndef DOXYGEN_SHOULD_SKIP_THIS 
   60    CLI11_INLINE std::string
 
   62        std::stringstream out;
 
   63        std::string commentLead;
 
   64        commentLead.push_back(commentChar);
 
   65        commentLead.push_back(
' ');
 
   67        std::vector<std::string> groups = app->get_groups();
 
   68        bool defaultUsed = 
false;
 
   69        groups.insert(groups.begin(), std::string(
"Options"));
 
   70        for (
const auto& group : groups) {
 
   71            if (group == 
"Options" || group.empty()) {
 
   77            if (write_description && group != 
"Options" && !group.empty() &&
 
   78                !app->get_options([group](
const Option* opt) -> 
bool {
 
   79                        return opt->get_group() == group && opt->get_configurable();
 
   82                out << 
'\n' << commentChar << commentLead << group << 
"\n";
 
   84            for (
const Option* opt : app->get_options({})) {
 
   86                if (opt->get_configurable()) {
 
   87                    if (opt->get_group() != group) {
 
   88                        if (!(group == 
"Options" && opt->get_group().empty())) {
 
   92                    const std::string name = prefix + opt->get_single_name();
 
   94                        detail::ini_join(opt->reduced_results(), arraySeparator, arrayStart, arrayEnd, stringQuote, literalQuote);
 
   96                    std::string defaultValue{};
 
   98                        static_assert(std::string::npos + 
static_cast<std::string::size_type>(1) == 0,
 
   99                                      "std::string::npos + static_cast<std::string::size_type>(1) != 0");
 
  100                        if (!value.empty() && detail::convert_arg_for_ini(opt->get_default_str(), stringQuote, literalQuote) == value) {
 
  103                        if (!opt->get_default_str().empty()) {
 
  104                            defaultValue = detail::convert_arg_for_ini(opt->get_default_str(), stringQuote, literalQuote);
 
  105                            if (defaultValue == 
"'\"\"'") {
 
  108                        } 
else if (opt->get_run_callback_for_default()) {
 
  109                            defaultValue = 
"\"\""; 
 
  110                        } 
else if (opt->get_required()) {
 
  111                            defaultValue = 
"\"<REQUIRED>\"";
 
  112                        } 
else if (opt->get_expected_min() == 0) {
 
  113                            defaultValue = 
"false";
 
  115                            defaultValue = 
"\"\"";
 
  118                    if (write_description && opt->has_description() && (default_also || !value.empty())) {
 
  119                        out << commentLead << detail::fix_newlines(commentLead, opt->get_description()) << 
'\n';
 
  121                    if (default_also && !defaultValue.empty()) {
 
  122                        out << commentChar << name << valueDelimiter << defaultValue << 
"\n";
 
  124                    if (!value.empty()) {
 
  125                        if (!opt->get_fnames().empty()) {
 
  126                            value = opt->get_flag_value(name, value);
 
  128                        if (value == 
"\"default\"") {
 
  131                        out << name << valueDelimiter << value << 
"\n\n";
 
  138        auto subcommands = app->get_subcommands({});
 
  139        for (
const App* subcom : subcommands) {
 
  140            if (subcom->get_name().empty()) {
 
  141                if (write_description && !subcom->get_group().empty()) {
 
  142                    out << 
'\n' << commentLead << subcom->get_group() << 
" Options\n";
 
  144                out << 
to_config(subcom
, default_also
, write_description
, prefix
);
 
  148        for (
const App* subcom : subcommands) {
 
  149            if (!subcom->get_name().empty()) {
 
  150                if (subcom->get_configurable() && app->got_subcommand(subcom)) {
 
  151                    if (!prefix.empty() || app->get_parent() == 
nullptr) {
 
  152                        out << 
'[' << prefix << subcom->get_name() << 
"]\n";
 
  154                        std::string subname = app->get_name() + parentSeparatorChar + subcom->get_name();
 
  155                        const auto* p = app->get_parent();
 
  156                        while (p->get_parent() != 
nullptr) {
 
  157                            subname = p->get_name() + parentSeparatorChar + subname;
 
  160                        out << 
'[' << subname << 
"]\n";
 
  164                    out << 
to_config(subcom
, default_also
, write_description
, prefix + subcom->get_name() + parentSeparatorChar
);
 
  169        std::string outString;
 
  170        if (write_description && !out.str().empty()) {
 
  172                commentChar + std::string(
"#") + commentLead + detail::fix_newlines(commentChar + commentLead, app->get_description());
 
  175        return outString + out.str();
 
  178#ifndef CLI11_ORIGINAL_FORMATTER 
  182    CLI11_INLINE std::string 
HelpFormatter::
make_group(std::string group, 
bool is_positional, std::vector<
const Option*> opts) 
const {
 
  183        std::stringstream out;
 
  186        out << 
"\n" << group << 
":\n";
 
  187        for (
const Option* opt : opts) {
 
  188            out << make_option(opt, is_positional);
 
  195        std::string desc = app->get_description();
 
  196        auto min_options = app->get_require_option_min();
 
  197        auto max_options = app->get_require_option_max();
 
  199        if ((max_options == min_options) && (min_options > 0)) {
 
  200            if (min_options == 1) {
 
  201                desc += 
" \n[Exactly 1 of the following options is required]";
 
  203                desc += 
" \n[Exactly " + std::to_string(min_options) + 
" options from the following list are required]";
 
  205        } 
else if (max_options > 0) {
 
  206            if (min_options > 0) {
 
  207                desc += 
" \n[Between " + std::to_string(min_options) + 
" and " + std::to_string(max_options) +
 
  208                        " of the follow options are required]";
 
  210                desc += 
" \n[At most " + std::to_string(max_options) + 
" of the following options are allowed]";
 
  212        } 
else if (min_options > 0) {
 
  213            desc += 
" \n[At least " + std::to_string(min_options) + 
" of the following options are required]";
 
  215        return (!desc.empty()) ? desc + 
"\n" : std::string{};
 
  219        const std::string usage = app->get_usage();
 
  220        if (!usage.empty()) {
 
  224        std::stringstream out;
 
  226        out << get_label(
"Usage") << 
":" << (name.empty() ? 
"" : 
" ") << name;
 
  229        const std::vector<
const Option*> non_pos_options = app->get_options([](
const Option* opt) {
 
  230            return opt->nonpositional();
 
  232        if (!non_pos_options.empty()) {
 
  233            out << 
" [" << get_label(
"OPTIONS") << 
"]";
 
  237        std::vector<
const Option*> positionals = app->get_options([](
const Option* opt) {
 
  238            return opt->get_positional();
 
  242        if (!positionals.empty()) {
 
  244            std::vector<std::string> positional_names(positionals.size());
 
  245            std::transform(positionals.begin(), positionals.end(), positional_names.begin(), [
this](
const Option* opt) {
 
  246                return make_option_usage(opt);
 
  249            out << 
" " << detail::join(positional_names, 
" ");
 
  253        if (!app->get_subcommands([](
const App* subc) {
 
  254                    return !subc->get_disabled() && !subc->get_name().empty();
 
  259                << get_label(app->get_subcommands([](
const CLI::App* subc) {
 
  260                                    return ((!subc->get_disabled()) && (!subc->get_name().empty()) );
 
  268        const Option* disabledOpt = app->get_option_no_throw(
"--disabled");
 
  269        if (disabledOpt != 
nullptr ? disabledOpt->as<
bool>() : 
false) {
 
  270            out << 
" " << get_label(
"DISABLED");
 
  271        } 
else if (app->get_required()) {
 
  272            out << 
" " << get_label(
"REQUIRED");
 
  275        out << std::endl << std::endl;
 
  281        std::stringstream out;
 
  283        const std::vector<
const App*> subcommands = app->get_subcommands([](
const App* subc) {
 
  284            if (subc->get_group() == 
"Instances") {
 
  285                if (subc->get_option(
"--disabled")->as<
bool>()) {
 
  286                    const_cast<
CLI::App*>(subc)->group(subc->get_group() + 
" (disabled)");
 
  289            return !subc->get_disabled() && !subc->get_name().empty();
 
  293        std::set<std::string> subcmd_groups_seen;
 
  294        for (
const App* com : subcommands) {
 
  295            if (com->get_name().empty()) {
 
  296                if (!com->get_group().empty()) {
 
  301            std::string group_key = com->get_group();
 
  302            if (!group_key.empty() &&
 
  303                std::find_if(subcmd_groups_seen.begin(), subcmd_groups_seen.end(), [&group_key](
const std::string& a) {
 
  304                    return detail::to_lower(a) == detail::to_lower(group_key);
 
  305                }) == subcmd_groups_seen.end()) {
 
  306                subcmd_groups_seen.insert(group_key);
 
  311        const Option* disabledOpt = app->get_option_no_throw(
"--disabled");
 
  312        bool disabled = 
false;
 
  313        if (disabledOpt != 
nullptr) {
 
  314            disabled = disabledOpt->as<
bool>();
 
  318            for (
const std::string& group : subcmd_groups_seen) {
 
  319                out << 
"\n" << group << 
":\n";
 
  320                const std::vector<
const App*> subcommands_group = app->get_subcommands([&group](
const App* sub_app) {
 
  321                    return detail::to_lower(sub_app->get_group()) == detail::to_lower(group) && !sub_app->get_disabled() &&
 
  322                           !sub_app->get_name().empty();
 
  324                for (
const App* new_com : subcommands_group) {
 
  325                    if (new_com->get_name().empty()) {
 
  328                    if (mode != AppFormatMode::All) {
 
  331                        out << new_com->help(disabledOpt != 
nullptr && (app->get_help_ptr()->as<std::string>() == 
"exact" ||
 
  332                                                                        app->get_help_ptr()->as<std::string>() == 
"expanded")
 
  345        std::string tmp = out.str();
 
  346        if (mode == AppFormatMode::All && !tmp.empty()) {
 
  357        std::stringstream out;
 
  358        std::string name = 
"  " + sub->get_display_name(
true) + (sub->get_required() ? 
" " + get_label(
"REQUIRED") : 
"");
 
  360        out << std::setw(
static_cast<
int>(column_width_)) << std::left << name;
 
  361        std::string desc = sub->get_description();
 
  363            bool skipFirstLinePrefix = 
true;
 
  364            if (out.str().length() >= column_width_) {
 
  366                skipFirstLinePrefix = 
false;
 
  368            detail::streamOutAsParagraph(out, desc, right_column_width_, std::string(column_width_, 
' '), skipFirstLinePrefix);
 
  377        std::stringstream out;
 
  379        const Option* disabledOpt = sub->get_option_no_throw(
"--disabled");
 
  380        out << sub->get_display_name(
true) + 
" [OPTIONS]" + (!sub->get_subcommands({}).empty() ? 
" [SECTIONS]" : 
"") +
 
  381                   ((disabledOpt != 
nullptr ? disabledOpt->as<
bool>() : 
false) ? 
" " + get_label(
"DISABLED")
 
  382                                                                               : (sub->get_required() ? 
" " + get_label(
"REQUIRED") : 
""))
 
  385        detail::streamOutAsParagraph(out, 
make_description(sub
), description_paragraph_width_, 
""); 
 
  387        if (sub->get_name().empty() && !sub->get_aliases().empty()) {
 
  388            detail::format_aliases(out, sub->get_aliases(), column_width_ + 2);
 
  390        out << make_positionals(sub);
 
  391        out << make_groups(sub, mode);
 
  395        std::string tmp = out.str();
 
  399        return detail::find_and_replace(tmp, 
"\n", 
"\n  ") + 
"\n";
 
  403        std::stringstream out;
 
  405        if (!opt->get_option_text().empty()) {
 
  406            out << 
" " << opt->get_option_text();
 
  408            if (opt->get_type_size() != 0) {
 
  409                if (!opt->get_type_name().empty()) {
 
  411                    out << ((opt->get_items_expected_max() == 0) ? 
"=" : 
" ") << get_label(opt->get_type_name());
 
  413                if (!opt->get_default_str().empty()) {
 
  414                    out << 
" [" << opt->get_default_str() << 
"]";
 
  416                if (opt->count() > 0 && opt->get_default_str() != opt->as<std::string>()) {
 
  417                    out << 
" {" << opt->as<std::string>() << 
"}";
 
  419                if (opt->get_expected_max() == detail::expected_max_vector_size) {
 
  421                } 
else if (opt->get_expected_min() > 1) {
 
  422                    out << 
" x " << opt->get_expected();
 
  424                if (opt->get_required() && !get_label(
"REQUIRED").empty()) {
 
  425                    out << 
" " << get_label(
"REQUIRED");
 
  427                if (opt->get_configurable() && !get_label(
"PERSISTENT").empty()) {
 
  428                    out << 
" " << get_label(
"PERSISTENT");
 
  431            if (!opt->get_envname().empty()) {
 
  432                out << 
" (" << get_label(
"Env") << 
":" << opt->get_envname() << 
") ";
 
  434            if (!opt->get_needs().empty()) {
 
  435                out << 
" " << get_label(
"Needs") << 
":";
 
  436                for (
const Option* op : opt->get_needs()) {
 
  437                    out << 
" " << op->get_name();
 
  440            if (!opt->get_excludes().empty()) {
 
  441                out << 
" " << get_label(
"Excludes") << 
":";
 
  442                for (
const Option* op : opt->get_excludes()) {
 
  443                    out << 
" " << op->get_name();