#pragma once #include #include #include #include namespace hex::log { namespace { void printPrefix() { const auto now = fmt::localtime(std::chrono::system_clock::now()); fmt::print("[{0:%H:%M:%S}] [{1}] ", now, IMHEX_PROJECT_NAME); } } FILE *getDestination(); bool isRedirected(); template void print(fmt::format_string fmt, T &&...args) { fmt::print(getDestination(), fmt, args...); } template void print(const fmt::text_style &ts, const S &fmt, const Args &...args) { printPrefix(); if (isRedirected()) fmt::print(getDestination(), fmt::runtime(fmt), args...); else fmt::print(getDestination(), ts, fmt, args...); } void debug(const std::string &fmt, auto... args) { #if defined(DEBUG) log::print(fg(fmt::color::green_yellow) | fmt::emphasis::bold, "[DEBUG] "); log::print(fmt::runtime(fmt), args...); log::print("\n"); #endif } void info(const std::string &fmt, auto... args) { log::print(fg(fmt::color::cadet_blue) | fmt::emphasis::bold, "[INFO] "); log::print(fmt::runtime(fmt), args...); log::print("\n"); } void warn(const std::string &fmt, auto... args) { log::print(fg(fmt::color::orange) | fmt::emphasis::bold, "[WARN] "); log::print(fmt::runtime(fmt), args...); log::print("\n"); } void error(const std::string &fmt, auto... args) { log::print(fg(fmt::color::red) | fmt::emphasis::bold, "[ERROR] "); log::print(fmt::runtime(fmt), args...); log::print("\n"); } void fatal(const std::string &fmt, auto... args) { log::print(fg(fmt::color::purple) | fmt::emphasis::bold, "[FATAL] "); log::print(fmt::runtime(fmt), args...); log::print("\n"); } void redirectToFile(); }