#pragma once namespace Components { class Logger : public Component { public: Logger(); ~Logger(); #if defined(DEBUG) || defined(FORCE_UNIT_TESTS) const char* getName() override { return "Logger"; }; #endif static void MessagePrint(int channel, std::string message); static void Print(int channel, const char* message, ...); static void Print(const char* message, ...); static void ErrorPrint(int error, std::string message); static void Error(const char* message, ...); static void Error(int error, const char* message, ...); static void SoftError(const char* message, ...); static bool IsConsoleReady(); static void PrintStub(int channel, const char* message, ...); static void PipeOutput(void(*callback)(std::string)); static void Flush(); private: static std::mutex MessageMutex; static std::vector MessageQueue; static std::vector LoggingAddresses[2]; static void(*PipeCallback)(std::string); static void Frame(); static void GameLogStub(); static void PrintMessageStub(); static void PrintMessagePipe(const char* data); static void EnqueueMessage(std::string message); static void BuildOSPathStub(); static void RedirectOSPath(const char* file, char* folder); static void NetworkLog(const char* data, bool gLog); static std::string Format(const char** message); }; }