#ifndef LOG_HPP #define LOG_HPP // #define PATTERN "[{}{}{}] " #include #include #include enum class LOG { INF, WRN, ERR, DBG }; inline std::mutex mtx; template inline void log(LOG level, std::string_view tag, std::format_string str, Args&&... args) { constexpr std::string_view reset = "\033[0m"; constexpr std::string_view green = "\033[32m"; constexpr std::string_view yellow = "\033[33m"; constexpr std::string_view red = "\033[31m"; constexpr std::string_view pattern = "[{}{}{}] "; std::scoped_lock lock(mtx); switch (level) { case LOG::INF: std::print(pattern, green, tag, reset); break; case LOG::WRN: std::print(pattern, yellow, tag, reset); break; case LOG::ERR: std::print(pattern, red, tag, reset); break; default: std::print(pattern, "", tag, ""); } std::println(str, std::forward(args)...); } #endif