usages in subparsers

v2
Brett 2025-02-13 14:04:39 -05:00
parent 89d95dfec4
commit 31b28c7787
2 changed files with 18 additions and 5 deletions

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.20) cmake_minimum_required(VERSION 3.20)
include(cmake/color.cmake) include(cmake/color.cmake)
set(BLT_VERSION 4.0.5) set(BLT_VERSION 4.0.6)
set(BLT_TARGET BLT) set(BLT_TARGET BLT)

View File

@ -253,8 +253,9 @@ namespace blt::argparse
friend argument_subparser_t; friend argument_subparser_t;
public: public:
explicit argument_parser_t(const std::optional<std::string_view> name = {}, const std::optional<std::string_view> usage = {}): explicit argument_parser_t(const std::optional<std::string_view> name = {}, const std::optional<std::string_view> usage = {},
m_name(name), m_usage(usage) const std::optional<std::string_view> description = {}, const std::optional<std::string_view> epilogue = {}):
m_name(name), m_usage(usage), m_description(description), m_epilogue(epilogue)
{ {
} }
@ -278,13 +279,21 @@ namespace blt::argparse
class argument_subparser_t class argument_subparser_t
{ {
public: public:
explicit argument_subparser_t(const argument_parser_t& parent): m_parent(&parent) explicit argument_subparser_t(const argument_parser_t& parent): m_parent(&parent), m_usage(parent.m_usage),
m_description(parent.m_description), m_epilogue(parent.m_epilogue)
{
}
explicit argument_subparser_t(const argument_parser_t& parent, const std::optional<std::string_view> usage = {},
const std::optional<std::string_view> description = {},
const std::optional<std::string_view> epilogue = {}): m_parent(&parent), m_usage(usage),
m_description(description), m_epilogue(epilogue)
{ {
} }
argument_parser_t& add_parser(const std::string_view name) argument_parser_t& add_parser(const std::string_view name)
{ {
m_parsers.emplace(name); m_parsers.emplace(name, {}, m_usage, m_description, m_epilogue);
return m_parsers[name]; return m_parsers[name];
} }
@ -309,6 +318,7 @@ namespace blt::argparse
const auto it = m_parsers.find(key.get_name()); const auto it = m_parsers.find(key.get_name());
if (it == m_parsers.end()) if (it == m_parsers.end())
throw detail::subparse_error(key.get_argument(), get_allowed_strings()); throw detail::subparse_error(key.get_argument(), get_allowed_strings());
it->second.m_name = m_parent->m_name;
it->second.parse(consumer); it->second.parse(consumer);
} }
@ -322,6 +332,9 @@ namespace blt::argparse
} }
const argument_parser_t* m_parent; const argument_parser_t* m_parent;
std::optional<std::string> m_usage;
std::optional<std::string> m_description;
std::optional<std::string> m_epilogue;
hashmap_t<std::string_view, argument_parser_t> m_parsers; hashmap_t<std::string_view, argument_parser_t> m_parsers;
}; };
} }