daemon: added refactored cleaned up logic for future handling of broadcasting data
This commit is contained in:
parent
b6b300207b
commit
da3cebe1cd
1 changed files with 70 additions and 0 deletions
70
daemon/core/emulator/broadcast.py
Normal file
70
daemon/core/emulator/broadcast.py
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
from collections.abc import Callable
|
||||||
|
from typing import TypeVar, Union
|
||||||
|
|
||||||
|
from core.emulator.data import (
|
||||||
|
ConfigData,
|
||||||
|
EventData,
|
||||||
|
ExceptionData,
|
||||||
|
FileData,
|
||||||
|
LinkData,
|
||||||
|
NodeData,
|
||||||
|
)
|
||||||
|
from core.errors import CoreError
|
||||||
|
|
||||||
|
T = TypeVar(
|
||||||
|
"T",
|
||||||
|
bound=Union[
|
||||||
|
EventData,
|
||||||
|
ExceptionData,
|
||||||
|
NodeData,
|
||||||
|
LinkData,
|
||||||
|
FileData,
|
||||||
|
ConfigData,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BroadcastManager:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
"""
|
||||||
|
Creates a BroadcastManager instance.
|
||||||
|
"""
|
||||||
|
self.handlers: dict[type[T], set[Callable[[T], None]]] = {}
|
||||||
|
|
||||||
|
def send(self, data: T) -> None:
|
||||||
|
"""
|
||||||
|
Retrieve handlers for data, and run all current handlers.
|
||||||
|
|
||||||
|
:param data: data to provide to handlers
|
||||||
|
:return: nothing
|
||||||
|
"""
|
||||||
|
handlers = self.handlers.get(type(data), set())
|
||||||
|
for handler in handlers:
|
||||||
|
handler(data)
|
||||||
|
|
||||||
|
def add_handler(self, data_type: type[T], handler: Callable[[T], None]) -> None:
|
||||||
|
"""
|
||||||
|
Add a handler for a given data type.
|
||||||
|
|
||||||
|
:param data_type: type of data to add handler for
|
||||||
|
:param handler: handler to add
|
||||||
|
:return: nothing
|
||||||
|
"""
|
||||||
|
handlers = self.handlers.setdefault(data_type, set())
|
||||||
|
handlers.add(handler)
|
||||||
|
|
||||||
|
def remove_handler(self, data_type: type[T], handler: Callable[[T], None]) -> None:
|
||||||
|
"""
|
||||||
|
Remove a handler for a given data type.
|
||||||
|
|
||||||
|
:param data_type: type of data to remove handler for
|
||||||
|
:param handler: handler to remove
|
||||||
|
:return: nothing
|
||||||
|
"""
|
||||||
|
handlers = self.handlers.get(data_type, set())
|
||||||
|
if handler not in handlers:
|
||||||
|
raise CoreError(
|
||||||
|
f"cannot remove data({data_type}) handler({repr(handler)}), "
|
||||||
|
f"does not exist "
|
||||||
|
)
|
||||||
|
handlers.remove(handler)
|
Loading…
Reference in a new issue