#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) {} void Log(LogSeverity severity, const SourceLocation& /* location */, StringView msg) override { // Format(&m_writer, "$[ $ ] $:$: $\033[0m\n", SeverityToColor(severity), // SeverityToStr(severity), location.file, location.line, msg); Format(&m_writer, "$[ $ ] $\033[0m\n", SeverityToColor(severity), SeverityToStr(severity), msg); } }; class LogApiImpl : public LogApi { gsl::owner m_default_logger; public: explicit LogApiImpl(gsl::owner 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, {reinterpret_cast(written.data()), written.size()}); } }; void RegisterLogApi(ApiRegistry* api_registry) { auto* allocator = api_registry->Get()->system; auto* os_console_api = api_registry->Get()->console; gsl::owner default_logger = allocator->New(os_console_api); gsl::owner log_api = allocator->New(default_logger); api_registry->Set(log_api); } } // namespace deimos