export module Core.Logger; import Core.TerminalConstants; import Core.Meta; import Core.ToString; import Core.Std; #define SOURCE const std::source_location& sl = std::source_location::current() export namespace Core { enum class LogLevel { NONE, ERROR, WARNING, INFO, DEBUG }; extern LogLevel logLevel; using ReportHandler = void (*)( LogLevel l, const std::source_location& sl, void* data, const char* message); void callReportHandler(LogLevel l, const char* report, SOURCE) noexcept; void setReportHandler(ReportHandler h, void* data) noexcept; struct FormatLocation final { const char* format; std::source_location location; FormatLocation(const char* f, SOURCE) noexcept : format(f), location(sl) { } }; template void report( LogLevel l, const FormatLocation& format, Args&&... args) noexcept { String<512> s; s.addFormat(format.format, Core::forward(args)...); callReportHandler(l, s, format.location); } const char* getShortFileName(const char* s) noexcept; template void log( LogLevel l, const char* prefix, const FormatLocation& format, Args&&... args) noexcept { if(logLevel < l) { return; } const char* file = getShortFileName(format.location.file_name()); fputs(prefix, stdout); print("{}:{} | ", file, format.location.line()); String<512> s; s.addFormat(format.format, Core::forward(args)...); s.print(); puts(Terminal::RESET); } template void logError(const FormatLocation& format, Args&&... args) noexcept { if constexpr(LOG_LEVEL >= 1) { String<32> s; s.addFormat("{}[ERROR] ", Terminal::FG_RED); log(LogLevel::ERROR, s, format, forward(args)...); } } template void logWarning(const FormatLocation& format, Args&&... args) noexcept { if constexpr(LOG_LEVEL >= 2) { String<32> s; s.addFormat("{}[WARNING] ", Terminal::FG_BRIGHT_YELLOW); log(LogLevel::WARNING, s, format, forward(args)...); } } template void logInfo(const FormatLocation& format, Args&&... args) noexcept { if constexpr(LOG_LEVEL >= 3) { String<32> s; s.addFormat("{}[INFO] ", Terminal::BOLD); log(LogLevel::INFO, s, format, forward(args)...); } } template void logDebug(const FormatLocation& format, Args&&... args) noexcept { if constexpr(LOG_LEVEL >= 4) { String<32> s; s.addFormat( "{}{}[DEBUG] ", Terminal::BOLD, Terminal::FG_BRIGHT_BLACK); log(LogLevel::DEBUG, s, format, forward(args)...); } } }