From 5aebd6b56237b71eee152b0bdd0d755006440fc3 Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Wed, 20 Mar 2019 20:46:22 +0900 Subject: [PATCH] fix: restore the back compat of format_error the following code was okay in the last release ``` toml::format_error("[test]", v, "test", {"hint1", "hint2"}) ``` but was not okay in the current master. This commit fixes this. cons: By this, the number of values to show is limited upto 3. --- tests/test_format_error.cpp | 6 ++-- toml/value.hpp | 56 +++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/tests/test_format_error.cpp b/tests/test_format_error.cpp index 36cb171..23cdea5 100644 --- a/tests/test_format_error.cpp +++ b/tests/test_format_error.cpp @@ -22,7 +22,7 @@ BOOST_AUTO_TEST_CASE(test_1_value) { const std::string pretty_error = toml::format_error("[error] test error", val, "this is a value", - std::vector{"this is a hint"}); + {"this is a hint"}); std::cout << pretty_error << std::endl; } } @@ -44,7 +44,7 @@ BOOST_AUTO_TEST_CASE(test_2_values) toml::format_error("[error] test error with two values", v1, "this is the answer", v2, "this is the pi", - std::vector{"hint"}); + {"hint"}); std::cout << pretty_error << std::endl; } } @@ -69,7 +69,7 @@ BOOST_AUTO_TEST_CASE(test_3_values) v1, "this is the answer", v2, "this is the pi", v3, "this is a meta-syntactic variable", - std::vector{"hint 1", "hint 2"}); + {"hint 1", "hint 2"}); std::cout << pretty_error << std::endl; } } diff --git a/toml/value.hpp b/toml/value.hpp index 340396f..74b2265 100644 --- a/toml/value.hpp +++ b/toml/value.hpp @@ -847,38 +847,40 @@ inline bool operator>=(const toml::value& lhs, const toml::value& rhs) return !(lhs < rhs); } -namespace detail -{ -inline std::string format_error_impl(const std::string& err_msg, - std::vector> val, - std::vector hints) -{ - return format_underline(err_msg, std::move(val), std::move(hints)); -} -inline std::string format_error_impl(const std::string& err_msg, - std::vector> val) -{ - return format_underline(err_msg, std::move(val)); -} - -template -std::string format_error_impl(const std::string& err_msg, - std::vector> val, +inline std::string format_error(const std::string& err_msg, const toml::value& v, const std::string& comment, - Ts&& ... args) + std::vector hints = {}) { - val.push_back(std::make_pair(std::addressof(get_region(v)), comment)); - return format_error_impl(err_msg, std::move(val), std::forward(args)...); + return detail::format_underline(err_msg, + std::vector>{ + {std::addressof(detail::get_region(v)), comment} + }, std::move(hints)); } -} // detail -template -std::string format_error(const std::string& err_msg, Ts&& ... args) +inline std::string format_error(const std::string& err_msg, + const toml::value& v1, const std::string& comment1, + const toml::value& v2, const std::string& comment2, + std::vector hints = {}) { - std::vector> val; - val.reserve(sizeof...(args) / 2); - return detail::format_error_impl(err_msg, std::move(val), - std::forward(args)...); + return detail::format_underline(err_msg, + std::vector>{ + {std::addressof(detail::get_region(v1)), comment1}, + {std::addressof(detail::get_region(v2)), comment2} + }, std::move(hints)); +} + +inline std::string format_error(const std::string& err_msg, + const toml::value& v1, const std::string& comment1, + const toml::value& v2, const std::string& comment2, + const toml::value& v3, const std::string& comment3, + std::vector hints = {}) +{ + return detail::format_underline(err_msg, + std::vector>{ + {std::addressof(detail::get_region(v1)), comment1}, + {std::addressof(detail::get_region(v2)), comment2}, + {std::addressof(detail::get_region(v3)), comment3} + }, std::move(hints)); } template