Line data Source code
1 : /*! 2 : * \file esys/repo/tui/capturelogger.cpp 3 : * \brief 4 : * 5 : * \cond 6 : * __legal_b__ 7 : * 8 : * Copyright (c) 2026 Michel Gillet 9 : * Distributed under the MIT License. 10 : * (See accompanying file LICENSE.txt or 11 : * copy at https://opensource.org/licenses/MIT) 12 : * 13 : * __legal_e__ 14 : * \endcond 15 : * 16 : */ 17 : 18 : #include "esys/repo/esysrepo_prec.h" 19 : #include "esys/repo/tui/capturelogger.h" 20 : 21 : #include <sstream> 22 : 23 : namespace esys::repo::tui 24 : { 25 : 26 : namespace 27 : { 28 : 29 0 : const char *level_tag(log::Level level) 30 : { 31 0 : switch (level) 32 : { 33 : case log::Level::CRITICAL: return "critical"; 34 0 : case log::Level::ERROR: return "error"; 35 0 : case log::Level::WARN: return "warn"; 36 0 : case log::Level::INFO: return "info"; 37 0 : case log::Level::DEBUG: return "debug"; 38 0 : case log::Level::TRACE: return "trace"; 39 0 : case log::Level::OFF: return "off"; 40 : } 41 0 : return "info"; 42 : } 43 : 44 : } // namespace 45 : 46 0 : CaptureLogger::CaptureLogger(std::shared_ptr<log::Logger_if> inner, std::shared_ptr<LogBuffer> buffer, 47 0 : std::function<void()> on_line) 48 0 : : m_inner(std::move(inner)) 49 0 : , m_buffer(std::move(buffer)) 50 0 : , m_on_line(std::move(on_line)) 51 : { 52 0 : } 53 : 54 0 : CaptureLogger::~CaptureLogger() = default; 55 : 56 0 : void CaptureLogger::capture(const char *tag, const std::string &msg) 57 : { 58 0 : if (m_buffer == nullptr) return; 59 : 60 0 : std::istringstream iss(msg); 61 0 : std::string line; 62 0 : bool any = false; 63 0 : while (std::getline(iss, line)) 64 : { 65 0 : if (!line.empty() && line.back() == '\r') line.pop_back(); 66 0 : m_buffer->push(std::string("[") + tag + "] " + line); 67 0 : any = true; 68 : } 69 0 : if (!any) m_buffer->push(std::string("[") + tag + "] "); 70 0 : if (m_on_line) m_on_line(); 71 0 : } 72 : 73 0 : void CaptureLogger::trace(const std::string &msg) 74 : { 75 0 : capture("trace", msg); 76 0 : if (m_inner) m_inner->trace(msg); 77 0 : } 78 : 79 0 : void CaptureLogger::debug(int level, const std::string &msg) 80 : { 81 0 : capture("debug", msg); 82 0 : if (m_inner) m_inner->debug(level, msg); 83 0 : } 84 : 85 0 : void CaptureLogger::info(const std::string &msg) 86 : { 87 0 : capture("info", msg); 88 0 : if (m_inner) m_inner->info(msg); 89 0 : } 90 : 91 0 : void CaptureLogger::warn(const std::string &msg) 92 : { 93 0 : capture("warn", msg); 94 0 : if (m_inner) m_inner->warn(msg); 95 0 : } 96 : 97 0 : void CaptureLogger::error(const std::string &msg) 98 : { 99 0 : capture("error", msg); 100 0 : if (m_inner) m_inner->error(msg); 101 0 : } 102 : 103 0 : void CaptureLogger::critical(const std::string &msg) 104 : { 105 0 : capture("critical", msg); 106 0 : if (m_inner) m_inner->critical(msg); 107 0 : } 108 : 109 0 : void CaptureLogger::log(log::Level level, const std::string &msg) 110 : { 111 0 : capture(level_tag(level), msg); 112 0 : if (m_inner) m_inner->log(level, msg); 113 0 : } 114 : 115 0 : void CaptureLogger::log(const std::string &msg, log::Level level, int debug_level) 116 : { 117 0 : capture(level_tag(level), msg); 118 0 : if (m_inner) m_inner->log(msg, level, debug_level); 119 0 : } 120 : 121 0 : void CaptureLogger::lock_console() 122 : { 123 0 : if (m_inner) m_inner->lock_console(); 124 0 : } 125 : 126 0 : void CaptureLogger::unlock_console() 127 : { 128 0 : if (m_inner) m_inner->unlock_console(); 129 0 : } 130 : 131 0 : std::shared_ptr<log::Logger_if> CaptureLogger::get_inner() const 132 : { 133 0 : return m_inner; 134 : } 135 : 136 : } // namespace esys::repo::tui