Skip to content

Commit

Permalink
Add formatter for std::exception
Browse files Browse the repository at this point in the history
Co-authored-by: fekir <[email protected]>
Co-authored-by: Alexey Ochapov <[email protected]>
  • Loading branch information
3 people committed Aug 31, 2022
1 parent a337011 commit 7da2a28
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
18 changes: 17 additions & 1 deletion include/fmt/std.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#ifndef FMT_STD_H_
#define FMT_STD_H_

#include <exception>
#include <thread>
#include <type_traits>
#include <utility>
Expand Down Expand Up @@ -166,6 +167,21 @@ struct formatter<
}
};
FMT_END_NAMESPACE
#endif

#endif // __cpp_lib_variant

FMT_BEGIN_NAMESPACE
template <typename T, typename Char>
struct formatter<
T, Char,
typename std::enable_if<std::is_base_of<std::exception, T>::value>::type>
: formatter<std::string> {
template <typename FormatContext>
auto format(const std::exception& ex, FormatContext& ctx) const ->
typename FormatContext::iterator {
return fmt::formatter<std::string>::format(ex.what(), ctx);
}
};
FMT_END_NAMESPACE

#endif // FMT_STD_H_
20 changes: 19 additions & 1 deletion test/std-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
// For the license information refer to format.h.

#include "fmt/std.h"
#include "fmt/ranges.h"

#include <string>
#include <vector>

#include "fmt/ranges.h"
#include "gtest/gtest.h"

TEST(std_test, path) {
Expand Down Expand Up @@ -77,3 +77,21 @@ TEST(std_test, variant) {
EXPECT_EQ(fmt::format("{}", v5), "variant(\"yes, this is variant\")");
#endif
}

TEST(std_test, exception) {
try {
std::vector<int> vec;
std::ignore = vec.at(42);
} catch (const std::exception& ex) {
EXPECT_EQ(fmt::format("{}", ex), "invalid vector subscript");
EXPECT_EQ(fmt::format("{:?}", ex), "\"invalid vector subscript\"");
}

try {
std::vector<int> vec;
std::ignore = vec.at(42);
} catch (const std::out_of_range& ex) {
EXPECT_EQ(fmt::format("{}", ex), "invalid vector subscript");
EXPECT_EQ(fmt::format("{:?}", ex), "\"invalid vector subscript\"");
}
}

0 comments on commit 7da2a28

Please sign in to comment.