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";
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";
94class EventBus :
public ISubject,
public std::enable_shared_from_this<EventBus> {
105 std::vector<std::weak_ptr<IObserver>> observers_;
114 mutable std::mutex observers_mutex_;
127 static std::string getEventColor(
Event::Type 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;
160 return ConsoleColor::WHITE;
175 static std::string getEventIcon(
Event::Type type) {
233 void attach(std::shared_ptr<IObserver> observer)
override {
234 std::lock_guard<std::mutex> lock(observers_mutex_);
235 observers_.push_back(observer);
249 void detach(std::shared_ptr<IObserver> observer_to_remove)
override {
250 std::lock_guard<std::mutex> lock(observers_mutex_);
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);
258 observers_.erase(it, observers_.end());
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;
280 std::string formattedMessage = color + icon +
" " +
event.details +
281 sourceColor +
" [" +
event.source_name +
"]" +
285 Event coloredEvent = event;
286 coloredEvent.
details = formattedMessage;
288 for (
auto& observer : observers_) {
289 observer.lock()->update(coloredEvent);
Определяет структуру события, используемую для уведомлений по шаблону 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