Skip to content

Commit

Permalink
add service call prototype completer
Browse files Browse the repository at this point in the history
Signed-off-by: artivis <jeremie.deray@canonical.com>
  • Loading branch information
artivis committed Jul 26, 2019
1 parent 8841312 commit e623ffc
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
23 changes: 23 additions & 0 deletions ros2service/ros2service/api/__init__.py
Expand Up @@ -15,6 +15,9 @@
from rclpy.topic_or_service_is_hidden import topic_or_service_is_hidden
from ros2cli.node.strategy import NodeStrategy
from ros2srv.api import service_type_completer
from rosidl_parser.definition import NamespacedType
from rosidl_runtime_py.convert import message_to_yaml
from rosidl_runtime_py.import_message import import_message_from_namespaced_type


def get_service_names_and_types(*, node, include_hidden_services=False):
Expand Down Expand Up @@ -62,3 +65,23 @@ def __call__(self, prefix, parsed_args, **kwargs):
if n == service_name:
return t
return service_type_completer()


class ServicePrototypeCompleter:
"""Callable returning a service prototype."""

def __init__(self, *, service_type_key=None):
self.service_type_key = service_type_key

def __call__(self, prefix, parsed_args, **kwargs):
full_service_type = getattr(parsed_args, self.service_type_key)
try:
parts = full_service_type.split('/')
package_name = parts[0]
interface_type = parts[1]
service_type = parts[-1]
except LookupError:
return None
service = import_message_from_namespaced_type(
NamespacedType([package_name, interface_type], service_type))
return [message_to_yaml(service.Request())]
5 changes: 4 additions & 1 deletion ros2service/ros2service/verb/call.py
Expand Up @@ -19,6 +19,7 @@
from ros2cli.node import NODE_NAME_PREFIX
from ros2service.api import ServiceNameCompleter
from ros2service.api import ServiceTypeCompleter
from ros2service.api import ServicePrototypeCompleter
from ros2service.verb import VerbExtension
from rosidl_runtime_py import set_message_fields
import yaml
Expand All @@ -38,11 +39,13 @@ def add_arguments(self, parser, cli_name):
help="Type of the ROS service (e.g. 'std_srvs/srv/Empty')")
arg.completer = ServiceTypeCompleter(
service_name_key='service_name')
parser.add_argument(
arg = parser.add_argument(
'values', nargs='?', default='{}',
help='Values to fill the service request with in YAML format ' +
'(e.g. "{a: 1, b: 2}"), ' +
'otherwise the service request will be published with default values')
arg.completer = ServicePrototypeCompleter(
service_type_key='service_type')
parser.add_argument(
'-r', '--rate', metavar='N', type=float,
help='Repeat the call at a specific rate in Hz')
Expand Down

0 comments on commit e623ffc

Please sign in to comment.