Skip to content

Commit 1643c37

Browse files
authored
Merge pull request #656 from elbeno/improve-fatal-log
🎨 Improve CIB_FATAL
2 parents c1cf01d + ccb1cbb commit 1643c37

File tree

3 files changed

+48
-19
lines changed

3 files changed

+48
-19
lines changed

include/log/catalog/mipi_encoder.hpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,14 @@
1818

1919
namespace logging::mipi {
2020
namespace detail {
21-
template <logging::level L, typename S, typename T>
21+
template <logging::level L, typename S, typename... Args>
2222
constexpr auto to_message() {
2323
constexpr auto s = S::value;
2424
using char_t = typename std::remove_cv_t<decltype(s)>::value_type;
25-
return [&]<template <typename...> typename Tuple, typename... Args,
26-
std::size_t... Is>(Tuple<Args...> const &,
27-
std::integer_sequence<std::size_t, Is...>) {
25+
return [&]<std::size_t... Is>(std::integer_sequence<std::size_t, Is...>) {
2826
return sc::message<
2927
L, sc::undefined<sc::args<Args...>, char_t, s[Is]...>>{};
30-
}(T{}, std::make_integer_sequence<std::size_t, std::size(s)>{});
31-
}
32-
33-
template <logging::level L, typename Msg> constexpr auto to_message(Msg msg) {
34-
if constexpr (requires { msg.args; }) {
35-
return to_message<L, decltype(msg.str), decltype(msg.args)>();
36-
} else {
37-
return to_message<L, Msg, stdx::tuple<>>();
38-
}
28+
}(std::make_integer_sequence<std::size_t, std::size(s)>{});
3929
}
4030

4131
template <typename S> constexpr auto to_module() {
@@ -122,8 +112,8 @@ template <typename TDestinations> struct log_handler {
122112

123113
template <logging::level Level, typename ModuleId, typename Msg>
124114
ALWAYS_INLINE auto log_msg(Msg msg) -> void {
125-
msg.apply([&]<typename StringType>(StringType, auto... args) {
126-
using Message = decltype(detail::to_message<Level>(msg));
115+
msg.apply([&]<typename S, typename... Args>(S, Args... args) {
116+
using Message = decltype(detail::to_message<Level, S, Args...>());
127117
using Module = decltype(detail::to_module<ModuleId>());
128118
dispatch_message<Level>(catalog<Message>(), module<Module>(),
129119
static_cast<std::uint32_t>(args)...);

include/log/log.hpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,17 @@ using cib_log_module_id_t = typename logging::module_id_t<"default">::type;
9292
CIB_LOG(logging::default_flavor_t, logging::level::WARN, __VA_ARGS__)
9393
#define CIB_ERROR(...) \
9494
CIB_LOG(logging::default_flavor_t, logging::level::ERROR, __VA_ARGS__)
95-
#define CIB_FATAL(...) \
96-
(CIB_LOG(logging::default_flavor_t, logging::level::FATAL, __VA_ARGS__), \
97-
STDX_PANIC(__VA_ARGS__))
95+
96+
#define CIB_FATAL(MSG, ...) \
97+
[] { \
98+
constexpr auto str = sc::format(MSG##_sc __VA_OPT__(, ) __VA_ARGS__); \
99+
logging::log<logging::default_flavor_t, logging::level::FATAL, \
100+
cib_log_module_id_t>(__FILE__, __LINE__, str); \
101+
str.apply([]<typename S, typename... Args>(S s, Args... args) { \
102+
constexpr auto cts = stdx::ct_string_from_type(s); \
103+
stdx::panic<cts>(args...); \
104+
}); \
105+
}()
98106

99107
#define CIB_ASSERT(expr) \
100108
((expr) ? void(0) : CIB_FATAL("Assertion failure: " #expr))

test/log/log.cpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1+
#include <log/fmt/logger.hpp>
12
#include <log/log.hpp>
23

34
#include <stdx/ct_string.hpp>
45
#include <stdx/panic.hpp>
56

67
#include <catch2/catch_test_macros.hpp>
78

9+
#include <iterator>
10+
#include <string>
11+
#include <string_view>
12+
813
namespace {
914
bool panicked{};
1015

@@ -15,12 +20,38 @@ struct injected_handler {
1520
panicked = true;
1621
}
1722
};
23+
24+
std::string buffer{};
1825
} // namespace
1926

27+
template <>
28+
inline auto logging::config<> =
29+
logging::fmt::config{std::back_inserter(buffer)};
30+
2031
template <> inline auto stdx::panic_handler<> = injected_handler{};
2132

22-
TEST_CASE("FATAL calls compile-time panic", "[log]") {
33+
TEST_CASE("CIB_FATAL logs the string", "[log]") {
34+
CIB_FATAL("Hello");
35+
CAPTURE(buffer);
36+
CHECK(buffer.substr(buffer.size() - std::size("Hello")) == "Hello\n");
37+
}
38+
39+
TEST_CASE("CIB_FATAL respects the log module", "[log]") {
40+
CIB_LOG_MODULE("test");
41+
CIB_FATAL("Hello");
42+
CAPTURE(buffer);
43+
CHECK(buffer.substr(buffer.size() - std::size("FATAL [test]: Hello")) ==
44+
"FATAL [test]: Hello\n");
45+
}
46+
47+
TEST_CASE("CIB_FATAL calls compile-time panic", "[log]") {
2348
panicked = false;
2449
CIB_FATAL("Hello");
2550
CHECK(panicked);
2651
}
52+
53+
TEST_CASE("CIB_FATAL pre-formats arguments passed to panic", "[log]") {
54+
panicked = false;
55+
CIB_FATAL("{}", "Hello"_sc);
56+
CHECK(panicked);
57+
}

0 commit comments

Comments
 (0)