From f3ba19b162a89b2081c0598b4a0bf126146e3671 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 4 Apr 2024 22:05:06 +0200 Subject: Add logging system --- deimos/core/log.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 deimos/core/log.cpp (limited to 'deimos/core/log.cpp') diff --git a/deimos/core/log.cpp b/deimos/core/log.cpp new file mode 100644 index 0000000..befe4b7 --- /dev/null +++ b/deimos/core/log.cpp @@ -0,0 +1,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 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 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()->system; + auto* os_console_api = api_registry->Get()->console; + + auto* default_logger = allocator->New(os_console_api); + auto* log_api = allocator->New(default_logger); + + api_registry->Set(log_api); +} + +} // namespace deimos + -- cgit