| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 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);
- void setReportHandler(ReportHandler h, void* data);
- struct FormatLocation final {
- const char* format;
- std::source_location location;
- FormatLocation(
- const char* f,
- const std::source_location& l = std::source_location::current()) :
- format(f), location(l) {
- }
- };
- template<typename... Args>
- void report(LogLevel l, const FormatLocation& format, Args&&... args) {
- char buffer[512];
- formatBuffer(
- buffer, sizeof(buffer), format.format,
- Core::forward<Args>(args)...);
- callReportHandler(l, buffer, format.location);
- }
- const char* getShortFileName(const char* s);
- template<typename... Args>
- void log(
- LogLevel l, const char* prefix, const FormatLocation& format,
- Args&&... args) {
- if(logLevel < l) {
- return;
- }
- const char* file = getShortFileName(format.location.file_name());
- fputs(prefix, stdout);
- print("{}:{} | ", file, format.location.line());
- char buffer[512];
- formatBuffer(
- buffer, sizeof(buffer), format.format,
- Core::forward<Args>(args)...);
- fputs(buffer, stdout);
- puts(Terminal::RESET);
- }
- template<typename... Args>
- void logError(const FormatLocation& format, Args&&... args) {
- if constexpr(LOG_LEVEL >= 1) {
- char buffer[32];
- formatBuffer(
- buffer, sizeof(buffer), "{}[ERROR] ", Terminal::FG_RED);
- log(LogLevel::ERROR, buffer, format, forward<Args>(args)...);
- }
- }
- template<typename... Args>
- void logWarning(const FormatLocation& format, Args&&... args) {
- if constexpr(LOG_LEVEL >= 2) {
- char buffer[32];
- formatBuffer(
- buffer, sizeof(buffer), "{}[WARNING] ",
- Terminal::FG_BRIGHT_YELLOW);
- log(LogLevel::WARNING, buffer, format, forward<Args>(args)...);
- }
- }
- template<typename... Args>
- void logInfo(const FormatLocation& format, Args&&... args) {
- if constexpr(LOG_LEVEL >= 3) {
- char buffer[32];
- formatBuffer(buffer, sizeof(buffer), "{}[INFO] ", Terminal::BOLD);
- log(LogLevel::INFO, buffer, format, forward<Args>(args)...);
- }
- }
- template<typename... Args>
- void logDebug(const FormatLocation& format, Args&&... args) {
- if constexpr(LOG_LEVEL >= 4) {
- char buffer[32];
- formatBuffer(
- buffer, sizeof(buffer), "{}{}[DEBUG] ", Terminal::BOLD,
- Terminal::FG_BRIGHT_BLACK);
- log(LogLevel::DEBUG, buffer, format, forward<Args>(args)...);
- }
- }
- }
|