From e5c29c28709752a7cfa9fd65cab03073d3c6e688 Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Thu, 13 Dec 2018 17:07:03 +0900 Subject: [PATCH] enable to show err msg for 2 different location --- toml/region.hpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/toml/region.hpp b/toml/region.hpp index fb06915..e254673 100644 --- a/toml/region.hpp +++ b/toml/region.hpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include namespace toml { @@ -241,6 +241,64 @@ inline std::string format_underline(const std::string& message, return retval; } +// to show a better error message. +inline std::string format_underline(const std::string& message, + const region_base& reg1, const std::string& comment_for_underline1, + const region_base& reg2, const std::string& comment_for_underline2, + std::vector helps = {}) +{ +#ifdef _WIN32 + const auto newline = "\r\n"; +#else + const char newline = '\n'; +#endif + const auto line1 = reg1.line(); + const auto line_number1 = reg1.line_num(); + const auto line2 = reg2.line(); + const auto line_number2 = reg2.line_num(); + const auto line_num_width = + std::max(line_number1.size(), line_number2.size()); + + std::ostringstream retval; + retval << message; + retval << newline; + retval << " --> "; + retval << reg1.name() << newline;; +// --------------------------------------- + retval << ' ' << std::setw(line_num_width) << line_number1; + retval << " | " << line1 << newline; + retval << make_string(line_num_width + 1, ' '); + retval << " | "; + retval << make_string(reg1.before(), ' '); + retval << make_string(reg1.size(), '~'); + retval << ' '; + retval << comment_for_underline1 << newline; +// --------------------------------------- + retval << " ..." << newline; + retval << ' ' << std::setw(line_num_width) << line_number2; + retval << " | " << line2 << newline; + retval << make_string(line_num_width + 1, ' '); + retval << " | "; + retval << make_string(reg2.before(), ' '); + retval << make_string(reg2.size(), '~'); + retval << ' '; + retval << comment_for_underline2; + if(helps.size() != 0) + { + retval << newline; + retval << make_string(line_num_width + 1, ' '); + retval << " | "; + for(const auto help : helps) + { + retval << newline; + retval << "Hint: "; + retval << help; + } + } + return retval.str(); +} + + // to show a better error message. template std::string