@@ -63,6 +63,10 @@ pub struct Config<'a> {
63
63
#[ builder( default ) ]
64
64
pub impl_arbitrary : FeatureConfig < ' a > ,
65
65
66
+ /// Optional: `impl Serialize` and `impl Deserialize` for generated types.. Default: `Never`.
67
+ #[ builder( default ) ]
68
+ pub impl_serde : FeatureConfig < ' a > ,
69
+
66
70
/// Optional: `impl Error` for generated error type. Default: `Never`.
67
71
///
68
72
/// Note: this feature depends on `std`.
@@ -135,6 +139,17 @@ pub fn codegen(config: Config<'_>, out: impl Write) -> Result<()> {
135
139
writeln ! ( w, r##"#[cfg(feature = "arb")]"## ) ?;
136
140
writeln ! ( & mut w, "use arbitrary::{{Arbitrary, Unstructured}};" ) ?;
137
141
142
+ match config. impl_serde {
143
+ FeatureConfig :: Always => {
144
+ writeln ! ( & mut w, "use serde::{{Serialize, Deserialize}};" ) ?;
145
+ }
146
+ FeatureConfig :: Gated ( gate) => {
147
+ writeln ! ( w, r##"#[cfg(feature = "{gate}")]"## ) ?;
148
+ writeln ! ( & mut w, "use serde::{{Serialize, Deserialize}};" ) ?;
149
+ }
150
+ FeatureConfig :: Never => ( ) ,
151
+ }
152
+
138
153
writeln ! ( & mut w) ?;
139
154
140
155
render_dbc ( & mut w, & config, & dbc) . context ( "could not generate Rust code" ) ?;
@@ -167,6 +182,8 @@ fn render_root_enum(mut w: impl Write, dbc: &DBC, config: &Config<'_>) -> Result
167
182
writeln ! ( w, "/// All messages" ) ?;
168
183
writeln ! ( w, "#[derive(Clone)]" ) ?;
169
184
config. impl_debug . fmt_attr ( & mut w, "derive(Debug)" ) ?;
185
+ config. impl_serde . fmt_attr ( & mut w, "derive(Serialize)" ) ?;
186
+ config. impl_serde . fmt_attr ( & mut w, "derive(Deserialize)" ) ?;
170
187
writeln ! ( w, "pub enum Messages {{" ) ?;
171
188
{
172
189
let mut w = PadAdapter :: wrap ( & mut w) ;
@@ -230,9 +247,14 @@ fn render_message(mut w: impl Write, config: &Config<'_>, msg: &Message, dbc: &D
230
247
}
231
248
}
232
249
writeln ! ( w, "#[derive(Clone, Copy)]" ) ?;
250
+ config. impl_serde . fmt_attr ( & mut w, "derive(Serialize)" ) ?;
251
+ config. impl_serde . fmt_attr ( & mut w, "derive(Deserialize)" ) ?;
233
252
writeln ! ( w, "pub struct {} {{" , type_name( msg. message_name( ) ) ) ?;
234
253
{
235
254
let mut w = PadAdapter :: wrap ( & mut w) ;
255
+ config
256
+ . impl_serde
257
+ . fmt_attr ( & mut w, "serde(with = \" serde_bytes\" )" ) ;
236
258
writeln ! ( w, "raw: [u8; {}]," , msg. message_size( ) ) ?;
237
259
}
238
260
writeln ! ( w, "}}" ) ?;
@@ -941,6 +963,8 @@ fn write_enum(
941
963
writeln ! ( w, "/// Defined values for {}" , signal. name( ) ) ?;
942
964
writeln ! ( w, "#[derive(Clone, Copy, PartialEq)]" ) ?;
943
965
config. impl_debug . fmt_attr ( & mut w, "derive(Debug)" ) ?;
966
+ config. impl_serde . fmt_attr ( & mut w, "derive(Serialize)" ) ?;
967
+ config. impl_serde . fmt_attr ( & mut w, "derive(Deserialize)" ) ?;
944
968
writeln ! ( w, "pub enum {} {{" , type_name) ?;
945
969
{
946
970
let mut w = PadAdapter :: wrap ( & mut w) ;
@@ -1253,6 +1277,8 @@ fn render_multiplexor_enums(
1253
1277
) ?;
1254
1278
1255
1279
config. impl_debug . fmt_attr ( & mut w, "derive(Debug)" ) ?;
1280
+ config. impl_serde . fmt_attr ( & mut w, "derive(Serialize)" ) ?;
1281
+ config. impl_serde . fmt_attr ( & mut w, "derive(Deserialize)" ) ?;
1256
1282
writeln ! (
1257
1283
w,
1258
1284
"pub enum {} {{" ,
@@ -1278,6 +1304,8 @@ fn render_multiplexor_enums(
1278
1304
let struct_name = multiplexed_enum_variant_name ( msg, multiplexor_signal, * * switch_index) ?;
1279
1305
1280
1306
config. impl_debug . fmt_attr ( & mut w, "derive(Debug)" ) ?;
1307
+ config. impl_serde . fmt_attr ( & mut w, "derive(Serialize)" ) ?;
1308
+ config. impl_serde . fmt_attr ( & mut w, "derive(Deserialize)" ) ?;
1281
1309
writeln ! ( w, r##"#[derive(Default)]"## ) ?;
1282
1310
writeln ! (
1283
1311
w,
0 commit comments