From 4937192c6fe081c9e18f55876c25f4a470f4f560 Mon Sep 17 00:00:00 2001 From: fawdlstty Date: Fri, 18 Aug 2023 21:03:26 +0800 Subject: [PATCH 1/5] add serde big array support --- rosidl_generator_rs/resource/Cargo.toml.em | 1 + rosidl_generator_rs/resource/msg.rs.em | 2 ++ rosidl_generator_rs/resource/msg_idiomatic.rs.em | 2 +- rosidl_generator_rs/resource/msg_rmw.rs.em | 2 +- rosidl_generator_rs/resource/srv.rs.em | 2 ++ rosidl_generator_rs/rosidl_generator_rs/__init__.py | 13 ++++++++++++- 6 files changed, 19 insertions(+), 3 deletions(-) diff --git a/rosidl_generator_rs/resource/Cargo.toml.em b/rosidl_generator_rs/resource/Cargo.toml.em index 110d2c41d..51784f5f8 100644 --- a/rosidl_generator_rs/resource/Cargo.toml.em +++ b/rosidl_generator_rs/resource/Cargo.toml.em @@ -6,6 +6,7 @@ edition = "2021" [dependencies] rosidl_runtime_rs = "0.3" serde = { version = "1", optional = true, features = ["derive"] } +serde-big-array = "0.5.1" @[for dep in dependency_packages]@ @(dep) = "*" @[end for]@ diff --git a/rosidl_generator_rs/resource/msg.rs.em b/rosidl_generator_rs/resource/msg.rs.em index 8e9995743..3f7d10e5f 100644 --- a/rosidl_generator_rs/resource/msg.rs.em +++ b/rosidl_generator_rs/resource/msg.rs.em @@ -5,6 +5,7 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, msg_specs=msg_specs, get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type, + pre_field_serde=pre_field_serde, get_idiomatic_rs_type=get_idiomatic_rs_type, constant_value_to_rs=constant_value_to_rs) }@ @@ -16,6 +17,7 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, msg_specs=msg_specs, get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type, + pre_field_serde=pre_field_serde, get_idiomatic_rs_type=get_idiomatic_rs_type, constant_value_to_rs=constant_value_to_rs) }@ diff --git a/rosidl_generator_rs/resource/msg_idiomatic.rs.em b/rosidl_generator_rs/resource/msg_idiomatic.rs.em index b1974a3d8..e6ec28807 100644 --- a/rosidl_generator_rs/resource/msg_idiomatic.rs.em +++ b/rosidl_generator_rs/resource/msg_idiomatic.rs.em @@ -26,7 +26,7 @@ type_name = msg_spec.structure.namespaced_type.name #[derive(Clone, Debug, PartialEq, PartialOrd)] pub struct @(type_name) { @[for member in msg_spec.structure.members]@ - pub @(get_rs_name(member.name)): @(get_idiomatic_rs_type(member.type)), + @(pre_field_serde(member.type))pub @(get_rs_name(member.name)): @(get_idiomatic_rs_type(member.type)), @[end for]@ } diff --git a/rosidl_generator_rs/resource/msg_rmw.rs.em b/rosidl_generator_rs/resource/msg_rmw.rs.em index b85061815..c4420a685 100644 --- a/rosidl_generator_rs/resource/msg_rmw.rs.em +++ b/rosidl_generator_rs/resource/msg_rmw.rs.em @@ -38,7 +38,7 @@ extern "C" { #[derive(Clone, Debug, PartialEq, PartialOrd)] pub struct @(type_name) { @[for member in msg_spec.structure.members]@ - pub @(get_rs_name(member.name)): @(get_rmw_rs_type(member.type)), + @(pre_field_serde(member.type))pub @(get_rs_name(member.name)): @(get_rmw_rs_type(member.type)), @[end for]@ } diff --git a/rosidl_generator_rs/resource/srv.rs.em b/rosidl_generator_rs/resource/srv.rs.em index 31cabc768..369696ff7 100644 --- a/rosidl_generator_rs/resource/srv.rs.em +++ b/rosidl_generator_rs/resource/srv.rs.em @@ -12,6 +12,7 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, msg_specs=req_res_specs, get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type, + pre_field_serde=pre_field_serde, get_idiomatic_rs_type=get_idiomatic_rs_type, constant_value_to_rs=constant_value_to_rs) }@ @@ -49,6 +50,7 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, msg_specs=req_res_specs, get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type, + pre_field_serde=pre_field_serde, get_idiomatic_rs_type=get_idiomatic_rs_type, constant_value_to_rs=constant_value_to_rs) }@ diff --git a/rosidl_generator_rs/rosidl_generator_rs/__init__.py b/rosidl_generator_rs/rosidl_generator_rs/__init__.py index ae61a3e9f..103c05465 100644 --- a/rosidl_generator_rs/rosidl_generator_rs/__init__.py +++ b/rosidl_generator_rs/rosidl_generator_rs/__init__.py @@ -101,6 +101,7 @@ def generate_rs(generator_arguments_file, typesupport_impls): 'Services template file %s not found' % template_file data = { + 'pre_field_serde': pre_field_serde, 'get_rmw_rs_type': make_get_rmw_rs_type(args['package_name']), 'get_rs_name': get_rs_name, 'get_idiomatic_rs_type': make_get_idiomatic_rs_type(args['package_name']), @@ -274,6 +275,14 @@ def constant_value_to_rs(type_, value): # - BoundedSequence # - UnboundedSequence + +def pre_field_serde(type_): + if isinstance(type_, Array) and type_.size > 32: + return '#[cfg_attr(feature = "serde", serde(with = "serde_big_array::BigArray"))]\n ' + else: + return '' + + def make_get_idiomatic_rs_type(package_name): get_rmw_rs_type = make_get_rmw_rs_type(package_name) def get_idiomatic_rs_type(type_): @@ -335,7 +344,9 @@ def get_rmw_rs_type(type_): elif isinstance(type_, UnboundedSequence): return 'rosidl_runtime_rs::Sequence<{}>'.format(get_rmw_rs_type(type_.value_type)) elif isinstance(type_, BoundedSequence): - return 'rosidl_runtime_rs::BoundedSequence<{}, {}>'.format(get_rmw_rs_type(type_.value_type), type_.maximum_size) + return 'rosidl_runtime_rs::BoundedSequence<{}, {}>'.format( + get_rmw_rs_type(type_.value_type), + type_.maximum_size) assert False, "unknown type '%s'" % type_.typename return get_rmw_rs_type From 5f88c67f0d9738d29a0d5727075864146d00f81f Mon Sep 17 00:00:00 2001 From: fawdlstty Date: Fri, 18 Aug 2023 21:09:35 +0800 Subject: [PATCH 2/5] restore --- rosidl_generator_rs/rosidl_generator_rs/__init__.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rosidl_generator_rs/rosidl_generator_rs/__init__.py b/rosidl_generator_rs/rosidl_generator_rs/__init__.py index 103c05465..e0ca0921f 100644 --- a/rosidl_generator_rs/rosidl_generator_rs/__init__.py +++ b/rosidl_generator_rs/rosidl_generator_rs/__init__.py @@ -174,6 +174,7 @@ def generate_rs(generator_arguments_file, typesupport_impls): return 0 + def get_rs_name(name): keywords = [ # strict keywords @@ -189,6 +190,7 @@ def get_rs_name(name): # If the field name is a reserved keyword in Rust append an underscore return name if not name in keywords else name + '_' + def escape_string(s): s = s.replace('\\', '\\\\') s = s.replace("'", "\\'") @@ -256,7 +258,7 @@ def constant_value_to_rs(type_, value): assert False, "unknown constant type '%s'" % type_ # Type hierarchy: -# +# # AbstractType # - AbstractNestableType # - AbstractGenericString @@ -285,6 +287,7 @@ def pre_field_serde(type_): def make_get_idiomatic_rs_type(package_name): get_rmw_rs_type = make_get_rmw_rs_type(package_name) + def get_idiomatic_rs_type(type_): if isinstance(type_, UnboundedString) or isinstance(type_, UnboundedWString): return 'std::string::String' @@ -298,6 +301,7 @@ def get_idiomatic_rs_type(type_): return get_rmw_rs_type(type_) return get_idiomatic_rs_type + def make_get_rmw_rs_type(package_name): def get_rmw_rs_type(type_): if isinstance(type_, NamespacedType): @@ -344,9 +348,7 @@ def get_rmw_rs_type(type_): elif isinstance(type_, UnboundedSequence): return 'rosidl_runtime_rs::Sequence<{}>'.format(get_rmw_rs_type(type_.value_type)) elif isinstance(type_, BoundedSequence): - return 'rosidl_runtime_rs::BoundedSequence<{}, {}>'.format( - get_rmw_rs_type(type_.value_type), - type_.maximum_size) + return 'rosidl_runtime_rs::BoundedSequence<{}, {}>'.format(get_rmw_rs_type(type_.value_type), type_.maximum_size) assert False, "unknown type '%s'" % type_.typename return get_rmw_rs_type From 90f7be82357e1a8aa047109a396d42771ff40e92 Mon Sep 17 00:00:00 2001 From: fawdlstty Date: Fri, 18 Aug 2023 21:13:01 +0800 Subject: [PATCH 3/5] restore 1 --- rosidl_generator_rs/rosidl_generator_rs/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rosidl_generator_rs/rosidl_generator_rs/__init__.py b/rosidl_generator_rs/rosidl_generator_rs/__init__.py index e0ca0921f..8829fec2e 100644 --- a/rosidl_generator_rs/rosidl_generator_rs/__init__.py +++ b/rosidl_generator_rs/rosidl_generator_rs/__init__.py @@ -174,7 +174,6 @@ def generate_rs(generator_arguments_file, typesupport_impls): return 0 - def get_rs_name(name): keywords = [ # strict keywords @@ -190,7 +189,6 @@ def get_rs_name(name): # If the field name is a reserved keyword in Rust append an underscore return name if not name in keywords else name + '_' - def escape_string(s): s = s.replace('\\', '\\\\') s = s.replace("'", "\\'") @@ -258,7 +256,7 @@ def constant_value_to_rs(type_, value): assert False, "unknown constant type '%s'" % type_ # Type hierarchy: -# +# # AbstractType # - AbstractNestableType # - AbstractGenericString @@ -301,7 +299,6 @@ def get_idiomatic_rs_type(type_): return get_rmw_rs_type(type_) return get_idiomatic_rs_type - def make_get_rmw_rs_type(package_name): def get_rmw_rs_type(type_): if isinstance(type_, NamespacedType): From 906e5532a163200fcdf5d7af71f0d03515c6fd8d Mon Sep 17 00:00:00 2001 From: fawdlstty Date: Fri, 18 Aug 2023 21:13:44 +0800 Subject: [PATCH 4/5] restore 2 --- rosidl_generator_rs/rosidl_generator_rs/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/rosidl_generator_rs/rosidl_generator_rs/__init__.py b/rosidl_generator_rs/rosidl_generator_rs/__init__.py index 8829fec2e..762fd4884 100644 --- a/rosidl_generator_rs/rosidl_generator_rs/__init__.py +++ b/rosidl_generator_rs/rosidl_generator_rs/__init__.py @@ -285,7 +285,6 @@ def pre_field_serde(type_): def make_get_idiomatic_rs_type(package_name): get_rmw_rs_type = make_get_rmw_rs_type(package_name) - def get_idiomatic_rs_type(type_): if isinstance(type_, UnboundedString) or isinstance(type_, UnboundedWString): return 'std::string::String' From 5dd55d98f49fc045f325caf7af7e61e4f75544e2 Mon Sep 17 00:00:00 2001 From: fawdlstty Date: Tue, 22 Aug 2023 00:48:20 +0800 Subject: [PATCH 5/5] add optional & dep --- rosidl_generator_rs/resource/Cargo.toml.em | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rosidl_generator_rs/resource/Cargo.toml.em b/rosidl_generator_rs/resource/Cargo.toml.em index 51784f5f8..fcf3461d7 100644 --- a/rosidl_generator_rs/resource/Cargo.toml.em +++ b/rosidl_generator_rs/resource/Cargo.toml.em @@ -6,14 +6,14 @@ edition = "2021" [dependencies] rosidl_runtime_rs = "0.3" serde = { version = "1", optional = true, features = ["derive"] } -serde-big-array = "0.5.1" +serde-big-array = { version = "0.5.1", optional = true } @[for dep in dependency_packages]@ @(dep) = "*" @[end for]@ [features] @{ -serde_features = ["dep:serde", "rosidl_runtime_rs/serde"] +serde_features = ["dep:serde", "dep:serde-big-array", "rosidl_runtime_rs/serde"] for dep in dependency_packages: serde_features.append("{}/serde".format(dep)) }@