Line data Source code
1 : /* Copyright Cam Mannett 2020 2 : * 3 : * See LICENSE file 4 : */ 5 : 6 : #include "malbolge/log.hpp" 7 : 8 : #include <chrono> 9 : #include <iomanip> 10 : #include <atomic> 11 : 12 : using namespace malbolge; 13 : 14 : namespace 15 : { 16 : std::atomic<log::level> filter_level = log::INFO; 17 : std::mutex mtx; 18 : } 19 : 20 143 : std::ostream& log::detail::timestamp(std::ostream& stream) 21 : { 22 143 : const auto now = std::chrono::system_clock::now(); 23 143 : const auto c_now = std::chrono::system_clock::to_time_t(now); 24 : 25 : #ifdef EMSCRIPTEN 26 : // Browsers barely have millisecond accurate timers, so reduce from ns to ms 27 : const auto fractional = std::chrono::duration_cast<std::chrono::milliseconds>( 28 : now.time_since_epoch()).count() % std::milli::den; 29 : constexpr auto width = 3; 30 : #else 31 143 : const auto fractional = std::chrono::duration_cast<std::chrono::nanoseconds>( 32 143 : now.time_since_epoch()).count() % std::nano::den; 33 143 : constexpr auto width = 9; 34 : #endif 35 : 36 143 : return stream << std::put_time(std::localtime(&c_now), "%F %T") 37 143 : << "." << std::setfill('0') << std::setw(width) << fractional; 38 : } 39 : 40 143 : std::mutex& log::detail::log_lock() 41 : { 42 143 : return mtx; 43 : } 44 : 45 154 : const char* log::to_string(level lvl) noexcept 46 : { 47 : static_assert(NUM_LOG_LEVELS == 4, "Log levels have changed, update this"); 48 : 49 154 : switch (lvl) { 50 3 : case VERBOSE_DEBUG: 51 3 : return "VERBOSE DEBUG"; 52 30 : case DEBUG: 53 30 : return "DEBUG"; 54 81 : case INFO: 55 81 : return "INFO"; 56 38 : case ERROR: 57 38 : return "ERROR"; 58 2 : default: 59 2 : return "Unknown"; 60 : } 61 : } 62 : 63 7937 : log::level log::log_level() noexcept 64 : { 65 7937 : return filter_level; 66 : } 67 : 68 6 : void log::set_log_level(level lvl) noexcept 69 : { 70 6 : filter_level = lvl; 71 6 : } 72 : 73 292 : std::string_view log::detail::colour_to_ansi(colour c) noexcept 74 : { 75 : static_assert(static_cast<int>(colour::NUM_COLOURS) == 5, 76 : "Colours have changed, update this"); 77 : 78 292 : switch (c) { 79 37 : case colour::RED: 80 37 : return "\x1B[31m"; 81 108 : case colour::GREEN: 82 108 : return "\x1B[32m"; 83 1 : case colour::YELLOW: 84 1 : return "\x1B[33m"; 85 1 : case colour::BLUE: 86 1 : return "\x1B[34m"; 87 145 : default: 88 145 : return "\x1B[0m"; // colour::DEFAULT 89 : } 90 : } 91 : 92 143 : log::colour log::detail::log_level_to_colour(level lvl) noexcept 93 : { 94 143 : switch (lvl) { 95 36 : case ERROR: 96 36 : return colour::RED; 97 107 : default: 98 107 : return colour::GREEN; 99 : } 100 : }