Skip to content

Commit 6c87533

Browse files
authored
add serde big array support (fixed #327) (#328)
* add serde big array support
1 parent 8694d41 commit 6c87533

File tree

6 files changed

+17
-3
lines changed

6 files changed

+17
-3
lines changed

rosidl_generator_rs/resource/Cargo.toml.em

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ edition = "2021"
66
[dependencies]
77
rosidl_runtime_rs = "0.3"
88
serde = { version = "1", optional = true, features = ["derive"] }
9+
serde-big-array = { version = "0.5.1", optional = true }
910
@[for dep in dependency_packages]@
1011
@(dep) = "*"
1112
@[end for]@
1213

1314
[features]
1415
@{
15-
serde_features = ["dep:serde", "rosidl_runtime_rs/serde"]
16+
serde_features = ["dep:serde", "dep:serde-big-array", "rosidl_runtime_rs/serde"]
1617
for dep in dependency_packages:
1718
serde_features.append("{}/serde".format(dep))
1819
}@

rosidl_generator_rs/resource/msg.rs.em

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ TEMPLATE(
55
package_name=package_name, interface_path=interface_path,
66
msg_specs=msg_specs,
77
get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type,
8+
pre_field_serde=pre_field_serde,
89
get_idiomatic_rs_type=get_idiomatic_rs_type,
910
constant_value_to_rs=constant_value_to_rs)
1011
}@
@@ -16,6 +17,7 @@ TEMPLATE(
1617
package_name=package_name, interface_path=interface_path,
1718
msg_specs=msg_specs,
1819
get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type,
20+
pre_field_serde=pre_field_serde,
1921
get_idiomatic_rs_type=get_idiomatic_rs_type,
2022
constant_value_to_rs=constant_value_to_rs)
2123
}@

rosidl_generator_rs/resource/msg_idiomatic.rs.em

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type_name = msg_spec.structure.namespaced_type.name
2626
#[derive(Clone, Debug, PartialEq, PartialOrd)]
2727
pub struct @(type_name) {
2828
@[for member in msg_spec.structure.members]@
29-
pub @(get_rs_name(member.name)): @(get_idiomatic_rs_type(member.type)),
29+
@(pre_field_serde(member.type))pub @(get_rs_name(member.name)): @(get_idiomatic_rs_type(member.type)),
3030
@[end for]@
3131
}
3232

rosidl_generator_rs/resource/msg_rmw.rs.em

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ extern "C" {
3838
#[derive(Clone, Debug, PartialEq, PartialOrd)]
3939
pub struct @(type_name) {
4040
@[for member in msg_spec.structure.members]@
41-
pub @(get_rs_name(member.name)): @(get_rmw_rs_type(member.type)),
41+
@(pre_field_serde(member.type))pub @(get_rs_name(member.name)): @(get_rmw_rs_type(member.type)),
4242
@[end for]@
4343
}
4444

rosidl_generator_rs/resource/srv.rs.em

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ TEMPLATE(
1212
package_name=package_name, interface_path=interface_path,
1313
msg_specs=req_res_specs,
1414
get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type,
15+
pre_field_serde=pre_field_serde,
1516
get_idiomatic_rs_type=get_idiomatic_rs_type,
1617
constant_value_to_rs=constant_value_to_rs)
1718
}@
@@ -49,6 +50,7 @@ TEMPLATE(
4950
package_name=package_name, interface_path=interface_path,
5051
msg_specs=req_res_specs,
5152
get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type,
53+
pre_field_serde=pre_field_serde,
5254
get_idiomatic_rs_type=get_idiomatic_rs_type,
5355
constant_value_to_rs=constant_value_to_rs)
5456
}@

rosidl_generator_rs/rosidl_generator_rs/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ def generate_rs(generator_arguments_file, typesupport_impls):
101101
'Services template file %s not found' % template_file
102102

103103
data = {
104+
'pre_field_serde': pre_field_serde,
104105
'get_rmw_rs_type': make_get_rmw_rs_type(args['package_name']),
105106
'get_rs_name': get_rs_name,
106107
'get_idiomatic_rs_type': make_get_idiomatic_rs_type(args['package_name']),
@@ -274,6 +275,14 @@ def constant_value_to_rs(type_, value):
274275
# - BoundedSequence
275276
# - UnboundedSequence
276277

278+
279+
def pre_field_serde(type_):
280+
if isinstance(type_, Array) and type_.size > 32:
281+
return '#[cfg_attr(feature = "serde", serde(with = "serde_big_array::BigArray"))]\n '
282+
else:
283+
return ''
284+
285+
277286
def make_get_idiomatic_rs_type(package_name):
278287
get_rmw_rs_type = make_get_rmw_rs_type(package_name)
279288
def get_idiomatic_rs_type(type_):

0 commit comments

Comments
 (0)