From 174fb233c1d0423a6fce30330e8af4ba11e5e1c1 Mon Sep 17 00:00:00 2001 From: Martin Dahl Date: Wed, 26 Jan 2022 13:27:25 +0100 Subject: [PATCH] add #[serde(default)] to msg types allows skipping fields when deserializing from json. --- Cargo.toml | 6 +++--- r2r_msg_gen/Cargo.toml | 2 +- r2r_msg_gen/src/lib.rs | 1 + src/msg_types.rs | 30 ++++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index efcfb34..e7d41ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "r2r" -version = "0.6.0" +version = "0.6.1" authors = ["Martin Dahl "] description = "Easy to use, runtime-agnostic, async rust bindings for ROS2." license = "MIT AND Apache-2.0" @@ -21,7 +21,7 @@ thiserror = "1.0.30" lazy_static = "1.4.0" r2r_common = { path = "r2r_common", version = "0.3.0" } r2r_rcl = { path = "r2r_rcl", version = "0.3.0" } -r2r_msg_gen = { path = "r2r_msg_gen", version = "0.3.0" } +r2r_msg_gen = { path = "r2r_msg_gen", version = "0.3.1" } r2r_actions = { path = "r2r_actions", version = "0.3.0" } uuid = { version = "0.8.2", features = ["serde", "v4"] } retain_mut = "0.1.5" @@ -35,6 +35,6 @@ rand = "0.8.4" [build-dependencies] r2r_common = { path = "r2r_common", version = "0.3.0" } -r2r_msg_gen = { path = "r2r_msg_gen", version = "0.3.0" } +r2r_msg_gen = { path = "r2r_msg_gen", version = "0.3.1" } [workspace] diff --git a/r2r_msg_gen/Cargo.toml b/r2r_msg_gen/Cargo.toml index 827038d..f04c866 100644 --- a/r2r_msg_gen/Cargo.toml +++ b/r2r_msg_gen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "r2r_msg_gen" -version = "0.3.0" +version = "0.3.1" authors = ["Martin Dahl "] description = "Internal dependency to the r2r crate." license = "MIT" diff --git a/r2r_msg_gen/src/lib.rs b/r2r_msg_gen/src/lib.rs index a4fe0ce..d6cac3f 100644 --- a/r2r_msg_gen/src/lib.rs +++ b/r2r_msg_gen/src/lib.rs @@ -494,6 +494,7 @@ pub fn generate_rust_msg(module_: &str, prefix_: &str, name_: &str) -> String { let module_str = format!( " #[derive(Clone,Debug,PartialEq,Serialize,Deserialize)] + #[serde(default)] pub struct {msgname} {{\n {fields} }}\n diff --git a/src/msg_types.rs b/src/msg_types.rs index f35676a..263f385 100644 --- a/src/msg_types.rs +++ b/src/msg_types.rs @@ -583,6 +583,36 @@ mod tests { assert_eq!(msg, msg2); } + #[cfg(r2r__test_msgs__msg__Defaults)] + #[test] + fn test_untyped_json_default() { + // from the msg definition file: + // bool bool_value true + // byte byte_value 50 + // char char_value 100 + // float32 float32_value 1.125 + // ... + + // let's try to change only a few fields. + let json = r#" + { + "byte_value": 255, + "float32_value": 3.14 + }"#; + + let mut native = + WrappedNativeMsgUntyped::new_from("test_msgs/msg/Defaults").unwrap(); + let v: serde_json::Value = serde_json::from_str(json).unwrap(); + native.from_json(v).expect("could make default msg"); + let json2 = native.to_json().unwrap(); + let msg2: test_msgs::msg::Defaults = serde_json::from_value(json2).unwrap(); + + assert_eq!(msg2.bool_value, true); // the default + assert_eq!(msg2.byte_value, 255); // from our json + assert_eq!(msg2.char_value, 100); // the default + assert_eq!(msg2.float32_value, 3.14); // from our json + } + #[cfg(r2r__test_msgs__msg__Arrays)] #[test] fn test_test_msgs_array() -> () {