1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#include "deimos/core/log.h"
#include "deimos/core/api_registry.h"
#include "deimos/core/allocator.h"
#include "deimos/core/os.h"
namespace deimos
{
class DefaultLogger : public ILogger
{
OsConsoleWriter m_writer;
static const char* SeverityToStr(LogSeverity s)
{
switch (s)
{
case LogSeverity::kInfo: return "INFO ";
case LogSeverity::kDebug: return "DEBUG";
case LogSeverity::kError: return "ERROR";
}
}
static const char* SeverityToColor(LogSeverity s)
{
switch (s)
{
case LogSeverity::kInfo: return "";
case LogSeverity::kDebug: return "\033[2m";
case LogSeverity::kError: return "\033[91m";
}
}
public:
explicit DefaultLogger(OsConsoleApi* os_console_api) :
m_writer(os_console_api, OsConsoleType::kStdOut)
{}
// @Todo Use string views
void Log(LogSeverity severity, const SourceLocation& location, Span<const char> msg) override
{
Format(&m_writer, "$[ $ ] $:$: $\033[0m\n", SeverityToColor(severity),
SeverityToStr(severity), location.file, location.line, msg);
}
};
class LogApiImpl : public LogApi
{
ILogger* m_default_logger;
public:
explicit LogApiImpl(ILogger* default_logger) :
m_default_logger{default_logger}
{}
void LogVa(
LogSeverity severity,
const SourceLocation& location,
gsl::czstring msg,
Span<const FormatArg> args) override
{
std::byte buffer[1024];
BufferWriter message_writer({&buffer[0], 1024});
FormatVa(&message_writer, msg, args);
auto written = message_writer.GetWritten();
m_default_logger->Log(severity, location, {(const char*)written.data(), written.size()});
}
};
void RegisterLogApi(ApiRegistry* api_registry)
{
auto* allocator = api_registry->Get<AllocatorApi>()->system;
auto* os_console_api = api_registry->Get<OsApi>()->console;
auto* default_logger = allocator->New<DefaultLogger>(os_console_api);
auto* log_api = allocator->New<LogApiImpl>(default_logger);
api_registry->Set(log_api);
}
} // namespace deimos
|