diff --git a/launch/launch/actions/register_event_handler.py b/launch/launch/actions/register_event_handler.py index 85272fb75..44cc634f2 100644 --- a/launch/launch/actions/register_event_handler.py +++ b/launch/launch/actions/register_event_handler.py @@ -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. @@ -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.""" diff --git a/launch/launch/frontend/expose.py b/launch/launch/frontend/expose.py index dd94596a0..3e57e0307 100644 --- a/launch/launch/frontend/expose.py +++ b/launch/launch/frontend/expose.py @@ -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 @@ -29,6 +30,7 @@ from .parser import Parser # noqa: F401 action_parse_methods = {} +event_handler_parse_methods = {} substitution_parse_methods = {} @@ -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 @@ -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')