From 21457a790c07851ac323542631d45d8dc83b881d Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Wed, 1 Sep 2021 11:21:46 +0200
Subject: [PATCH] LOG: Get a logger from the sink if it was already created

---
 src/Lib/Log.cc | 17 +++++++++++++++++
 src/Lib/Log.hh |  7 ++++---
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/Lib/Log.cc b/src/Lib/Log.cc
index e09f7480..795786f8 100644
--- a/src/Lib/Log.cc
+++ b/src/Lib/Log.cc
@@ -69,6 +69,23 @@ LogSink::closeLoggerClients() noexcept
                        [](const std::weak_ptr<Logger> &weakPtr) { return !weakPtr.expired(); }));
 }
 
+std::shared_ptr<Logger>
+LogSink::getLoggerClient(const std::string_view category) const
+{
+    auto end = std::end(clientLoggers);
+    auto it  = std::find_if(std::begin(clientLoggers), end,
+                           [category](const std::weak_ptr<Logger> &weakPtr) {
+                               std::shared_ptr<Logger> sharedPtr = weakPtr.lock();
+                               return sharedPtr && (sharedPtr->getCategoryView() == category);
+                           });
+    if (it == end)
+        throw std::logic_error("Logger was not found");
+    std::shared_ptr<Logger> sharedPtr = (*it).lock();
+    if (sharedPtr == nullptr)
+        throw std::logic_error("Logger has expired");
+    return sharedPtr;
+}
+
 LogMessage
 Logger::logEvent(const char *fileName, const char *functionName, const int lineNumber,
                  const LogLevel logSeverity) noexcept
diff --git a/src/Lib/Log.hh b/src/Lib/Log.hh
index a9d4a22b..64cd059d 100644
--- a/src/Lib/Log.hh
+++ b/src/Lib/Log.hh
@@ -53,10 +53,11 @@ public:
     static std::shared_ptr<LogSink> newSink() noexcept;
     ~LogSink() noexcept;
 
+    void recieveLogMessage(const Logger *const, LogMessage const &) noexcept;
+
     void registerLoggerClient(std::shared_ptr<Logger>) noexcept;
     void closeLoggerClients() noexcept;
-
-    void recieveLogMessage(const Logger *const, LogMessage const &) noexcept;
+    std::shared_ptr<Logger> getLoggerClient(const std::string_view category) const;
 
 private:
     std::mutex messageQueueLock{};
@@ -126,7 +127,7 @@ class Logger : public std::enable_shared_from_this<Logger> {
 public:
     // Templated constructor, construct from anything that can be considered as
     // a string.
-    explicit Logger(LogSink *const sink, const std::string_view category) noexcept
+    explicit Logger(LogSink *const sink, const StringType auto category) noexcept
         : parentLogSink(sink)
         , logCategory(anyStringToStdString(category))
     {
-- 
GitLab