Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions launch/launch/actions/register_event_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,14 @@

from ..action import Action
from ..event_handler import BaseEventHandler
from ..frontend import Entity
from ..frontend import expose_action
from ..frontend import Parser # noqa: F401
from ..launch_context import LaunchContext
from ..launch_description_entity import LaunchDescriptionEntity


@expose_action('register_event_handler')
class RegisterEventHandler(Action):
"""
Action that registers an event handler.
Expand All @@ -43,6 +47,13 @@ def __init__(self, event_handler: BaseEventHandler, **kwargs) -> None:
super().__init__(**kwargs)
self.__event_handler = event_handler

@classmethod
def parse(cls, entity: Entity, parser: Parser):
"""Return `RegisterEventHandler` action and kwargs for constructing it."""
_, kwargs = super().parse(entity, parser)

return cls, kwargs

@property
def event_handler(self) -> BaseEventHandler:
"""Getter for self.__event_handler."""
Expand Down
19 changes: 19 additions & 0 deletions launch/launch/frontend/expose.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from typing import Text

from ..action import Action
from ..event_handler import EventHandler
from ..some_substitutions_type import SomeSubstitutionsType
from ..substitution import Substitution

Expand All @@ -29,6 +30,7 @@
from .parser import Parser # noqa: F401

action_parse_methods = {}
event_handler_parse_methods = {}
substitution_parse_methods = {}


Expand All @@ -40,6 +42,14 @@ def instantiate_action(entity: 'Entity', parser: 'Parser') -> Action:
return action_type(**kwargs)


def instantiate_event_handler(entity: 'Entity', parser: 'Parser') -> EventHandler:
"""Call the registered parsing method for the `Entity`."""
if entity.type_name not in event_handler_parse_methods:
raise RuntimeError('Unrecognized entity of the type: {}'.format(entity.type_name))
event_handler_type, kwargs = event_handler_parse_methods[entity.type_name](entity, parser)
return event_handler_type(**kwargs)


def instantiate_substitution(
type_name: Text,
args: Optional[Iterable[SomeSubstitutionsType]] = None
Expand Down Expand Up @@ -128,3 +138,12 @@ def expose_action(name: Text):
Read __expose_impl documentation.
"""
return __expose_impl(name, action_parse_methods, 'action')


def expose_event_handler(name: Text):
"""
Return a decorator for exposing an event handler.

Read __expose_impl documentation.
"""
return __expose_impl(name, event_handler_parse_methods, 'event_handler')