SVCS - Русская документация
Загрузка...
Поиск...
Не найдено
EventBus.hxx
См. документацию.
1
17#pragma once
18
19#include "Event.hxx"
20#include "IObserver.hxx"
21#include "ISubject.hxx"
22#include <algorithm>
23#include <vector>
24#include <memory>
25#include <mutex>
26
42namespace svcs::services {
43
53namespace ConsoleColor {
54 const std::string RESET = "\033[0m";
55 const std::string BLACK = "\033[30m";
56 const std::string RED = "\033[31m";
57 const std::string GREEN = "\033[32m";
58 const std::string YELLOW = "\033[33m";
59 const std::string BLUE = "\033[34m";
60 const std::string MAGENTA = "\033[35m";
61 const std::string CYAN = "\033[36m";
62 const std::string WHITE = "\033[37m";
63 const std::string BRIGHT_RED = "\033[91m";
64 const std::string BRIGHT_GREEN = "\033[92m";
65 const std::string BRIGHT_YELLOW = "\033[93m";
66 const std::string BRIGHT_BLUE = "\033[94m";
67 const std::string BRIGHT_MAGENTA = "\033[95m";
68 const std::string BRIGHT_CYAN = "\033[96m";
69 const std::string BRIGHT_WHITE = "\033[97m";
70
71 const std::string BOLD = "\033[1m";
72 const std::string DIM = "\033[2m";
73 const std::string ITALIC = "\033[3m";
74 const std::string UNDERLINE = "\033[4m";
75}
76
94class EventBus : public ISubject, public std::enable_shared_from_this<EventBus> {
95private:
105 std::vector<std::weak_ptr<IObserver>> observers_;
106
114 mutable std::mutex observers_mutex_;
115
127 static std::string getEventColor(Event::Type type) {
128 switch (type) {
130 return ConsoleColor::BRIGHT_GREEN;
132 return ConsoleColor::BRIGHT_GREEN;
134 return ConsoleColor::BRIGHT_RED;
136 return ConsoleColor::BRIGHT_YELLOW;
138 return ConsoleColor::BRIGHT_CYAN;
140 return ConsoleColor::BRIGHT_BLUE;
142 return ConsoleColor::GREEN;
144 return ConsoleColor::BRIGHT_MAGENTA;
146 return ConsoleColor::BRIGHT_GREEN;
148 return ConsoleColor::BRIGHT_RED;
150 return ConsoleColor::BRIGHT_CYAN;
152 return ConsoleColor::BRIGHT_BLUE;
154 return ConsoleColor::BRIGHT_YELLOW;
156 return ConsoleColor::BRIGHT_GREEN;
158 return ConsoleColor::BRIGHT_MAGENTA;
159 default:
160 return ConsoleColor::WHITE;
161 }
162 }
163
174 */
175 static std::string getEventIcon(Event::Type type) {
176 switch (type) {
178 return "✅";
180 return "💾";
182 return "❌";
184 return "⚠️ ";
186 return "ℹ️ ";
188 return "🐛";
190 return "💡";
192 return "🚀";
194 return "✅";
196 return "💥";
198 return "📤";
200 return "📥";
202 return "📦";
204 return "🔗";
206 return "🤝";
207 default:
208 return "";
209 }
210 }
211
212public:
220 ~EventBus() override = default;
221
233 void attach(std::shared_ptr<IObserver> observer) override {
234 std::lock_guard<std::mutex> lock(observers_mutex_);
235 observers_.push_back(observer);
236 }
237
249 void detach(std::shared_ptr<IObserver> observer_to_remove) override {
250 std::lock_guard<std::mutex> lock(observers_mutex_);
251
252 auto it = std::remove_if(observers_.begin(), observers_.end(),
253 [&](const std::weak_ptr<IObserver>& weak_obs) {
254 auto shared_obs = weak_obs.lock();
255 return shared_obs && (shared_obs == observer_to_remove);
256 }
257 );
258 observers_.erase(it, observers_.end());
259 }
260
274 void notify(const Event& event) const override {
275 std::string color = getEventColor(event.type);
276 std::string icon = getEventIcon(event.type);
277 std::string sourceColor = ConsoleColor::DIM + ConsoleColor::BLACK;
278
279 // Format message with colors
280 std::string formattedMessage = color + icon + " " + event.details +
281 sourceColor + " [" + event.source_name + "]" +
282 ConsoleColor::RESET;
283
284 // Create event copy with formatted message
285 Event coloredEvent = event;
286 coloredEvent.details = formattedMessage;
287
288 for (auto& observer : observers_) {
289 observer.lock()->update(coloredEvent);
290 }
291 }
292};
293
294}
Определяет структуру события, используемую для уведомлений по шаблону Observer.
Определяет интерфейс для компонента шаблона Observer.
Определяет интерфейс для компонента Subject (Издатель) шаблона Observer.
Потокобезопасная реализация ISubject для централизованного распределения событий.
Определения EventBus.hxx:66
void attach(std::shared_ptr< IObserver > observer) override
Регистрирует нового Observer.
Определения EventBus.hxx:174
void notify(const Event &event) const override
Отправляет событие всем активным Observers.
Определения EventBus.hxx:202
~EventBus() override=default
Виртуальный деструктор по умолчанию.
void detach(std::shared_ptr< IObserver > observer_to_remove) override
Отменяет регистрацию конкретного Observer.
Определения EventBus.hxx:184
Интерфейс Subject (Издатель) (Абстрактный Базовый Класс).
Определения ISubject.hxx:35
Определяет ANSI коды цветов для форматирования вывода в консоль.
Компоненты сервисного слоя и инфраструктурные сервисы.
Type
Типы событий, которые могут быть опубликованы.
Определения Event.hxx:31
@ NETWORK_SEND
Данные были отправлены по сети.
Определения Event.hxx:120
@ PROTOCOL_SUCCESS
Операция протокола успешно завершена.
Определения Event.hxx:110
@ DEBUG_MESSAGE
Отладочное сообщение для целей разработки.
Определения Event.hxx:90
@ OBJECT_TRANSFER
Выполняется передача объекта.
Определения Event.hxx:130
@ PROTOCOL_ERROR
В операции протокола произошла ошибка.
Определения Event.hxx:115
@ PROTOCOL_START
Операция протокола началась.
Определения Event.hxx:105
@ REFERENCE_UPDATE
Ссылка (ветка/тег) была обновлена.
Определения Event.hxx:135
@ GENERAL_INFO
Общее информационное сообщение.
Определения Event.hxx:80
@ ERROR_MESSAGE
Сообщение об ошибке для уведомления пользователя.
Определения Event.hxx:95
@ SAVE_SUCCESS
Операция сохранения (коммита) успешно завершена.
Определения Event.hxx:55
@ WARNING_MESSAGE
Предупреждающее сообщение о потенциальных проблемах.
Определения Event.hxx:100
@ NEGOTIATION_PHASE
Выполняется фаза согласования протокола.
Определения Event.hxx:140
@ REPOSITORY_INIT_SUCCESS
Инициализация репозитория успешно завершена.
Определения Event.hxx:45
@ HELP_MESSAGE
Справочное сообщение для помощи пользователю.
Определения Event.hxx:85
@ NETWORK_RECEIVE
Данные были получены по сети.
Определения Event.hxx:125
std::string details
Подробное описание или полезная нагрузка (например, хеш объекта).
Определения Event.hxx:151