| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- 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<typename... Args>
- void report(
- LogLevel l, const FormatLocation& format, Args&&... args) noexcept {
- String<512> s;
- s.addFormat(format.format, Core::forward<Args>(args)...);
- callReportHandler(l, s, format.location);
- }
- const char* getShortFileName(const char* s) noexcept;
- template<typename... Args>
- 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>(args)...);
- s.print();
- puts(Terminal::RESET);
- }
- template<typename... Args>
- 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>(args)...);
- }
- }
- template<typename... Args>
- 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>(args)...);
- }
- }
- template<typename... Args>
- 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>(args)...);
- }
- }
- template<typename... Args>
- 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>(args)...);
- }
- }
- }
|