Skip to content

Commit 78317d3

Browse files
committed
Added action generation
1 parent 061d5e2 commit 78317d3

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

rosidl_generator_rs/resource/action.rs.em

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,36 @@
1+
@{
2+
action_msg_specs = []
3+
4+
for subfolder, action in action_specs:
5+
action_msg_specs.append((subfolder, action.goal))
6+
action_msg_specs.append((subfolder, action.result))
7+
action_msg_specs.append((subfolder, action.feedback))
8+
action_msg_specs.append((subfolder, action.feedback_message))
9+
10+
action_srv_specs = []
11+
12+
for subfolder, action in action_specs:
13+
action_srv_specs.append((subfolder, action.send_goal_service))
14+
action_srv_specs.append((subfolder, action.get_result_service))
15+
}@
16+
17+
pub mod rmw {
18+
@{
19+
TEMPLATE(
20+
'msg_rmw.rs.em',
21+
package_name=package_name, interface_path=interface_path,
22+
msg_specs=action_msg_specs,
23+
get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type,
24+
get_idiomatic_rs_type=get_idiomatic_rs_type,
25+
constant_value_to_rs=constant_value_to_rs)
26+
}@
27+
} // mod rmw
28+
129
@{
230
TEMPLATE(
331
'msg_idiomatic.rs.em',
432
package_name=package_name, interface_path=interface_path,
5-
msg_specs=msg_specs,
33+
msg_specs=action_msg_specs,
634
get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type,
735
get_idiomatic_rs_type=get_idiomatic_rs_type,
836
constant_value_to_rs=constant_value_to_rs)

rosidl_generator_rs/rosidl_generator_rs/__init__.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
import rosidl_pycommon
2424

2525
from rosidl_parser.definition import AbstractGenericString
26+
from rosidl_parser.definition import AbstractNestedType
27+
from rosidl_parser.definition import AbstractSequence
28+
from rosidl_parser.definition import AbstractString
29+
from rosidl_parser.definition import AbstractWString
30+
from rosidl_parser.definition import Action
2631
from rosidl_parser.definition import Array
2732
from rosidl_parser.definition import BasicType
2833
from rosidl_parser.definition import BoundedSequence
@@ -86,13 +91,20 @@ def generate_rs(generator_arguments_file, typesupport_impls):
8691
os.path.join(template_dir, 'srv.rs.em'): ['rust/src/%s.rs'],
8792
}
8893

94+
mapping_actions = {
95+
os.path.join(template_dir, 'action.rs.em'): ['rust/src/%s.rs'],
96+
}
97+
8998
# Ensure the required templates exist
9099
for template_file in mapping_msgs.keys():
91100
assert os.path.exists(template_file), \
92101
'Messages template file %s not found' % template_file
93102
for template_file in mapping_srvs.keys():
94103
assert os.path.exists(template_file), \
95104
'Services template file %s not found' % template_file
105+
for template_file in mapping_actions.keys():
106+
assert os.path.exists(template_file), \
107+
'Actions template file %s not found' % template_file
96108

97109
data = {
98110
'pre_field_serde': pre_field_serde,
@@ -107,6 +119,7 @@ def generate_rs(generator_arguments_file, typesupport_impls):
107119
convert_lower_case_underscore_to_camel_case,
108120
'msg_specs': [],
109121
'srv_specs': [],
122+
'action_specs': [],
110123
'package_name': args['package_name'],
111124
'typesupport_impls': typesupport_impls,
112125
'interface_path': idl_rel_path,
@@ -121,6 +134,9 @@ def generate_rs(generator_arguments_file, typesupport_impls):
121134
for service in idl_content.get_elements_of_type(Service):
122135
data['srv_specs'].append(('srv', service))
123136

137+
for action in idl_content.get_elements_of_type(Action):
138+
data['action_specs'].append(('action', action))
139+
124140
if data['msg_specs']:
125141
for template_file, generated_filenames in mapping_msgs.items():
126142
for generated_filename in generated_filenames:
@@ -143,6 +159,17 @@ def generate_rs(generator_arguments_file, typesupport_impls):
143159
generated_file,
144160
minimum_timestamp=latest_target_timestamp)
145161

162+
if data['action_specs']:
163+
for template_file, generated_filenames in mapping_actions.items():
164+
for generated_filename in generated_filenames:
165+
generated_file = os.path.join(args['output_dir'],
166+
generated_filename % 'action')
167+
rosidl_pycommon.expand_template(
168+
os.path.join(template_dir, template_file),
169+
data.copy(),
170+
generated_file,
171+
minimum_timestamp=latest_target_timestamp)
172+
146173
rosidl_pycommon.expand_template(
147174
os.path.join(template_dir, 'lib.rs.em'),
148175
data.copy(),

0 commit comments

Comments
 (0)