From 4111905a7441a74933b1d6cdbf2e63a625967f1b Mon Sep 17 00:00:00 2001 From: Pranav Srinivas Kumar Date: Fri, 3 Nov 2023 22:05:46 -0500 Subject: [PATCH] Improved error reporting for #299 --- include/argparse/argparse.hpp | 172 ++++++++++++++++++++++++++-------- include/argparse/main.cpp | 8 ++ include/argparse/test | Bin 0 -> 123352 bytes test/CMakeLists.txt | 1 + test/test_error_reporting.cpp | 55 +++++++++++ 5 files changed, 195 insertions(+), 41 deletions(-) create mode 100644 include/argparse/main.cpp create mode 100755 include/argparse/test create mode 100644 test/test_error_reporting.cpp diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index 00fd13f..65b7006 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -214,7 +214,8 @@ inline auto do_from_chars(std::string_view s) -> T { if (ptr == last) { return x; } - throw std::invalid_argument{"pattern '" + std::string(s) + "' does not match to the end"}; + throw std::invalid_argument{"pattern '" + std::string(s) + + "' does not match to the end"}; } if (ec == std::errc::invalid_argument) { throw std::invalid_argument{"pattern '" + std::string(s) + "' not found"}; @@ -237,10 +238,12 @@ template struct parse_number { if (auto [ok, rest] = consume_hex_prefix(s); ok) { try { return do_from_chars(rest); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + std::string(s) + "' as hexadecimal: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + std::string(s) + "' as hexadecimal: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + std::string(s) + + "' as hexadecimal: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + std::string(s) + + "' as hexadecimal: " + err.what()); } } } else { @@ -248,14 +251,17 @@ template struct parse_number { // Shape 'x' already has to be specified try { return do_from_chars(s); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + std::string(s) + "' as hexadecimal: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + std::string(s) + "' as hexadecimal: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + std::string(s) + + "' as hexadecimal: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + std::string(s) + + "' as hexadecimal: " + err.what()); } } - throw std::invalid_argument{"pattern '" + std::string(s) + "' not identified as hexadecimal"}; + throw std::invalid_argument{"pattern '" + std::string(s) + + "' not identified as hexadecimal"}; } }; @@ -265,29 +271,35 @@ template struct parse_number { if (ok) { try { return do_from_chars(rest); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + std::string(s) + "' as hexadecimal: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + std::string(s) + "' as hexadecimal: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + std::string(s) + + "' as hexadecimal: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + std::string(s) + + "' as hexadecimal: " + err.what()); } } if (starts_with("0"sv, s)) { try { return do_from_chars(rest); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + std::string(s) + "' as octal: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + std::string(s) + "' as octal: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + std::string(s) + + "' as octal: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + std::string(s) + + "' as octal: " + err.what()); } } try { return do_from_chars(rest); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + std::string(s) + "' as decimal integer: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + std::string(s) + "' as decimal integer: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + std::string(s) + + "' as decimal integer: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + std::string(s) + + "' as decimal integer: " + err.what()); } } }; @@ -315,7 +327,8 @@ template inline auto do_strtod(std::string const &s) -> T { if (ptr == last) { return x; } - throw std::invalid_argument{"pattern '" + s + "' does not match to the end"}; + throw std::invalid_argument{"pattern '" + s + + "' does not match to the end"}; } if (errno == ERANGE) { throw std::range_error{"'" + s + "' not representable"}; @@ -332,10 +345,12 @@ template struct parse_number { try { return do_strtod(s); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + s + "' as number: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + s + "' as number: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + s + + "' as number: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + s + + "' as number: " + err.what()); } } }; @@ -348,10 +363,12 @@ template struct parse_number { try { return do_strtod(s); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + s + "' as hexadecimal: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + s + "' as hexadecimal: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + s + + "' as hexadecimal: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + s + + "' as hexadecimal: " + err.what()); } } }; @@ -369,10 +386,12 @@ template struct parse_number { try { return do_strtod(s); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + s + "' as scientific notation: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + s + "' as scientific notation: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + s + + "' as scientific notation: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + s + + "' as scientific notation: " + err.what()); } } }; @@ -390,10 +409,12 @@ template struct parse_number { try { return do_strtod(s); - } catch (const std::invalid_argument& err) { - throw std::invalid_argument("Failed to parse '" + s + "' as fixed notation: " + err.what()); - } catch (const std::range_error& err) { - throw std::range_error("Failed to parse '" + s + "' as fixed notation: " + err.what()); + } catch (const std::invalid_argument &err) { + throw std::invalid_argument("Failed to parse '" + s + + "' as fixed notation: " + err.what()); + } catch (const std::range_error &err) { + throw std::range_error("Failed to parse '" + s + + "' as fixed notation: " + err.what()); } } }; @@ -795,6 +816,34 @@ public: } } + std::string get_names_csv() const { + return std::accumulate( + m_names.begin(), m_names.end(), std::string{""}, + [](const std::string &result, const std::string &name) { + return result.empty() ? name : result + ',' + name; + }); + } + + std::string get_usage_full() const { + std::stringstream usage; + + if (!m_is_required) { + usage << "["; + } + usage << get_names_csv(); + const std::string metavar = !m_metavar.empty() ? m_metavar : "VAR"; + if (m_num_args_range.get_max() > 0) { + usage << " " << metavar; + if (m_num_args_range.get_max() > 1) { + usage << "..."; + } + } + if (!m_is_required) { + usage << "]"; + } + return usage.str(); + } + std::string get_inline_usage() const { std::stringstream usage; // Find the longest variant to show in the usage string @@ -1759,8 +1808,49 @@ private: unprocessed_arguments); } - throw std::runtime_error( - "Maximum number of positional arguments exceeded"); + if (m_positional_arguments.empty()) { + + if (!m_optional_arguments.empty()) { + bool not_help_or_version{true}; + for (const auto &opt : m_optional_arguments) { + + // Find first optional argument that is + // neither help nor version + for (auto &name : opt.m_names) { + auto pos = name.find("help"); + if (pos != std::string::npos) { + not_help_or_version = false; + break; + } + + pos = name.find("version"); + if (pos != std::string::npos) { + not_help_or_version = false; + break; + } + } + + if (not_help_or_version) { + if (!opt.m_is_used) { + throw std::runtime_error( + "Zero positional arguments expected, did you mean '" + + opt.get_usage_full() + "'"); + } + } + + // continue searching + not_help_or_version = true; + } + + throw std::runtime_error("Zero positional arguments expected"); + } else { + throw std::runtime_error("Zero positional arguments expected"); + } + } else { + throw std::runtime_error("Maximum number of positional arguments " + "exceeded, failed to parse '" + + current_argument + "'"); + } } auto argument = positional_argument_it++; it = argument->consume(it, end); diff --git a/include/argparse/main.cpp b/include/argparse/main.cpp new file mode 100644 index 0000000..34ccd4f --- /dev/null +++ b/include/argparse/main.cpp @@ -0,0 +1,8 @@ +#include "argparse.hpp" + +int main(int argc, char* argv[]) { + argparse::ArgumentParser program; + program.add_argument("-a").required(); + program.add_argument("-b", "--bro").required(); + program.parse_args(argc, argv); +} \ No newline at end of file diff --git a/include/argparse/test b/include/argparse/test new file mode 100755 index 0000000000000000000000000000000000000000..ec9e543d5969c74e29a558bbf1d3088bda6e0265 GIT binary patch literal 123352 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 literal 0 HcmV?d00001 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 87104e9..c7b5c13 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -35,6 +35,7 @@ file(GLOB ARGPARSE_TEST_SOURCES test_const_correct.cpp test_default_args.cpp test_default_value.cpp + test_error_reporting.cpp test_get.cpp test_help.cpp test_invalid_arguments.cpp diff --git a/test/test_error_reporting.cpp b/test/test_error_reporting.cpp new file mode 100644 index 0000000..fc23a96 --- /dev/null +++ b/test/test_error_reporting.cpp @@ -0,0 +1,55 @@ +#ifdef WITH_MODULE +import argparse; +#else +#include +#endif +#include + +#include +#include +#include + +using doctest::test_suite; + +TEST_CASE("Missing optional argument name" * test_suite("error_reporting")) { + argparse::ArgumentParser parser("test"); + parser.add_argument("-a"); + parser.add_argument("-b"); + + SUBCASE("Good case") { + REQUIRE_NOTHROW(parser.parse_args({"test", "-a", "1", "-b", "2"})); + } + + SUBCASE("Bad case") { + REQUIRE_THROWS_WITH_AS( + parser.parse_args({"test", "-a", "1", "2"}), + "Zero positional arguments expected, did you mean '[-b VAR]'", + std::runtime_error); + } + + SUBCASE("Bad case 2") { + REQUIRE_THROWS_WITH_AS( + parser.parse_args({"test", "1", "2"}), + "Zero positional arguments expected, did you mean '[-a VAR]'", + std::runtime_error); + } +} + +TEST_CASE("Missing optional argument name with other positional arguments" * + test_suite("error_reporting")) { + argparse::ArgumentParser parser("test"); + parser.add_argument("-a"); + parser.add_argument("-b"); + parser.add_argument("c"); + + SUBCASE("Good case") { + REQUIRE_NOTHROW(parser.parse_args({"test", "-a", "1", "-b", "2", "3"})); + } + + SUBCASE("Bad case") { + REQUIRE_THROWS_WITH_AS( + parser.parse_args({"test", "-a", "1", "2", "3", "4"}), + "Maximum number of positional arguments exceeded, failed to parse '3'", + std::runtime_error); + } +} \ No newline at end of file