Skip to content

Commit a86a121

Browse files
Add ConsoleLogSink class
1 parent db21a07 commit a86a121

3 files changed

Lines changed: 96 additions & 0 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright (C) 2025 Albin Johansson
2+
// This software is provided under the terms of the MIT License.
3+
4+
#pragma once
5+
6+
#include "tactile/core/log/log_sink.hpp"
7+
8+
namespace tactile {
9+
10+
/// A log sink that forwards messages to the console.
11+
class ConsoleLogSink final : public ILogSink
12+
{
13+
public:
14+
void flush() override;
15+
16+
void log(const LogEntry& entry) override;
17+
18+
void set_ansi_colors(bool enabled);
19+
20+
private:
21+
bool m_ansi_colors {true};
22+
};
23+
24+
} // namespace tactile
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (C) 2025 Albin Johansson
2+
// This software is provided under the terms of the MIT License.
3+
4+
#include "tactile/core/log/console_log_sink.hpp"
5+
6+
#include <iostream>
7+
#include <ostream>
8+
9+
#include "tactile/core/container/string.hpp"
10+
11+
namespace tactile {
12+
namespace {
13+
14+
constexpr StringView kAnsiColorReset = "\x1B[0m";
15+
constexpr StringView kAnsiColorFgRedBold = "\x1B[31m\x1B[1m";
16+
constexpr StringView kAnsiColorFgYellow = "\x1B[33m";
17+
constexpr StringView kAnsiColorFgMagenta = "\x1B[35m";
18+
constexpr StringView kAnsiColorFgCyan = "\x1B[36m";
19+
constexpr StringView kAnsiColorFgWhite = "\x1B[37m";
20+
21+
auto to_ansi_color(const LogCategory category) noexcept -> StringView
22+
{
23+
switch (category) {
24+
case LogCategory::kVerbose:
25+
return kAnsiColorFgMagenta;
26+
27+
case LogCategory::kDebug:
28+
return kAnsiColorFgCyan;
29+
30+
case LogCategory::kInfo:
31+
return kAnsiColorFgWhite;
32+
33+
case LogCategory::kWarn:
34+
return kAnsiColorFgYellow;
35+
36+
case LogCategory::kError:
37+
return kAnsiColorFgRedBold;
38+
}
39+
40+
return kAnsiColorFgWhite;
41+
}
42+
43+
} // namespace
44+
45+
void ConsoleLogSink::flush()
46+
{
47+
std::clog << std::flush;
48+
}
49+
50+
void ConsoleLogSink::log(const LogEntry& entry)
51+
{
52+
if (m_ansi_colors) {
53+
std::clog << to_ansi_color(entry.category);
54+
}
55+
56+
std::clog << entry.prefix << ' ' << entry.message;
57+
58+
if (m_ansi_colors) {
59+
std::clog << kAnsiColorReset;
60+
}
61+
62+
std::clog << '\n';
63+
}
64+
65+
void ConsoleLogSink::set_ansi_colors(const bool enabled)
66+
{
67+
m_ansi_colors = enabled;
68+
}
69+
70+
} // namespace tactile

tools/cmake/targets/tactile_core.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ target_sources(tactile_core
1818
"${PROJECT_SOURCE_DIR}/include/tactile/core/container/string.hpp"
1919
"${PROJECT_SOURCE_DIR}/include/tactile/core/container/variant.hpp"
2020
"${PROJECT_SOURCE_DIR}/include/tactile/core/container/vector.hpp"
21+
"${PROJECT_SOURCE_DIR}/include/tactile/core/log/console_log_sink.hpp"
2122
"${PROJECT_SOURCE_DIR}/include/tactile/core/log/log_category.hpp"
2223
"${PROJECT_SOURCE_DIR}/include/tactile/core/log/log_entry.hpp"
2324
"${PROJECT_SOURCE_DIR}/include/tactile/core/log/log_sink.hpp"
@@ -31,5 +32,6 @@ target_sources(tactile_core
3132
"${PROJECT_SOURCE_DIR}/include/tactile/core/primitives.hpp"
3233

3334
PRIVATE
35+
"${PROJECT_SOURCE_DIR}/src/tactile/core/log/console_log_sink.cpp"
3436
"${PROJECT_SOURCE_DIR}/src/tactile/core/meta/attribute.cpp"
3537
)

0 commit comments

Comments
 (0)