diff options
Diffstat (limited to 'deimos/core/log.cpp')
-rw-r--r-- | deimos/core/log.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
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<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
+
|