diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index 3f5ddee1..48b336e5 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -1376,6 +1376,8 @@ class ArgumentParser { : "\n") << "Subcommands:\n"; for (const auto &[command, subparser] : parser.m_subparser_map) { + if (subparser->get().m_hide_from_help) + continue; stream << std::setw(2) << " "; stream << std::setw(static_cast(longest_arg_length - 2)) << command; @@ -1420,7 +1422,9 @@ class ArgumentParser { if (!m_subparser_map.empty()) { stream << " {"; std::size_t i{0}; - for (const auto &[command, unused] : m_subparser_map) { + for (const auto &[command, subparser] : m_subparser_map) { + if (subparser->get().m_hide_from_help) + continue; if (i == 0) { stream << command; } else { @@ -1443,13 +1447,19 @@ class ArgumentParser { return out.str(); } - void add_subparser(ArgumentParser &parser) { + void add_subparser(ArgumentParser &parser, bool hidden_from_help = false) { + if (hidden_from_help) + parser.set_hide_from_help(true); parser.m_parser_path = m_program_name + " " + parser.m_program_name; auto it = m_subparsers.emplace(std::cend(m_subparsers), parser); m_subparser_map.insert_or_assign(parser.m_program_name, it); m_subparser_used.insert_or_assign(parser.m_program_name, false); } + void set_hide_from_help(bool hide) { + m_hide_from_help = hide; + } + private: bool is_valid_prefix_char(char c) const { return m_prefix_chars.find(c) != std::string::npos; @@ -1706,6 +1716,7 @@ class ArgumentParser { std::list> m_subparsers; std::map m_subparser_map; std::map m_subparser_used; + bool m_hide_from_help = false; }; } // namespace argparse