diff --git a/rosrust/Cargo.toml b/rosrust/Cargo.toml index aa7ccab..7d29d25 100644 --- a/rosrust/Cargo.toml +++ b/rosrust/Cargo.toml @@ -29,6 +29,9 @@ regex = "1.3.1" criterion = "0.3.0" env_logger = "0.7.1" +[features] +derive-serde = ["rosrust_codegen/derive-serde"] + [[bench]] name = "benchmarks" harness = false diff --git a/rosrust_codegen/Cargo.toml b/rosrust_codegen/Cargo.toml index 6df22e3..e7a93f5 100644 --- a/rosrust_codegen/Cargo.toml +++ b/rosrust_codegen/Cargo.toml @@ -8,6 +8,11 @@ readme = "README.md" repository = "https://github.com/adnanademovic/rosrust" version = "0.9.3" + +[features] +derive-serde = ["serde"] + + [dependencies] error-chain = "0.12.1" lazy_static = "1.4.0" @@ -19,5 +24,10 @@ digest = "0.8.1" md-5 = "0.8.0" hex = "0.4.0" +[dependencies.serde] +serde = "1.0" + + + [lib] proc-macro = true diff --git a/rosrust_codegen/src/lib.rs b/rosrust_codegen/src/lib.rs index 4cfebe2..250788e 100644 --- a/rosrust_codegen/src/lib.rs +++ b/rosrust_codegen/src/lib.rs @@ -2,6 +2,9 @@ extern crate proc_macro; +#[cfg(feature="derive-serde")] +use serde; + mod error; mod genmsg; mod helpers; diff --git a/rosrust_codegen/src/msg.rs b/rosrust_codegen/src/msg.rs index 105855b..a38ac4f 100644 --- a/rosrust_codegen/src/msg.rs +++ b/rosrust_codegen/src/msg.rs @@ -64,8 +64,16 @@ impl Msg { .iter() .map(|v| v.const_token_stream(crate_prefix)) .collect::>(); + + let serde_derives = if cfg!(feature = "derive-serde") { + quote! { #[derive(::serde::Serialize, ::serde::Deserialize)] } + } else { + quote! {} + }; + quote! { #[allow(dead_code, non_camel_case_types, non_snake_case)] + #serde_derives #[derive(Clone)] pub struct #name { #(#fields)* @@ -387,6 +395,7 @@ fn match_lines(data: &str) -> Result> { .chain_err(|| "Failed to parse line in data string") } +#[cfg_attr(feature = "derive-serde", derive(::serde::Serialize, ::serde::Deserialize))] #[derive(Debug, PartialEq)] struct FieldLine { field_type: String, diff --git a/rosrust_codegen/src/output_layout.rs b/rosrust_codegen/src/output_layout.rs index ff88491..960d3ca 100644 --- a/rosrust_codegen/src/output_layout.rs +++ b/rosrust_codegen/src/output_layout.rs @@ -130,8 +130,15 @@ impl Service { let req_ident = Ident::new(&format!("{}Req", name), Span::call_site()); let res_ident = Ident::new(&format!("{}Res", name), Span::call_site()); + let serde_derives = if cfg!(feature = "derive-serde") { + quote! { #[derive(::serde::Serialize, ::serde::Deserialize)] } + } else { + quote! {} + }; + quote! { #[allow(dead_code,non_camel_case_types,non_snake_case)] + #serde_derives #[derive(Clone, Debug, Default, PartialEq)] pub struct #name_ident;