in serde-generate/src/rust.rs [333:394]
fn output_container(&mut self, name: &str, format: &ContainerFormat) -> Result<()> {
self.output_comment(name)?;
let mut derive_macros = self.generator.derive_macros.clone();
if self.generator.config.serialization {
derive_macros.push("Serialize".to_string());
derive_macros.push("Deserialize".to_string());
}
let mut prefix = String::new();
if !derive_macros.is_empty() {
prefix.push_str(&format!("#[derive({})]\n", derive_macros.join(", ")));
}
if let Some(text) = &self.generator.custom_derive_block {
prefix.push_str(text);
prefix.push('\n');
}
if self.generator.track_visibility {
prefix.push_str("pub ");
}
use ContainerFormat::*;
match format {
UnitStruct => writeln!(self.out, "{}struct {};\n", prefix, name)?,
NewTypeStruct(format) => writeln!(
self.out,
"{}struct {}({}{});\n",
prefix,
name,
if self.generator.track_visibility {
"pub "
} else {
""
},
Self::quote_type(format, Some(&self.known_sizes))
)?,
TupleStruct(formats) => writeln!(
self.out,
"{}struct {}({});\n",
prefix,
name,
Self::quote_types(formats, Some(&self.known_sizes))
)?,
Struct(fields) => {
writeln!(self.out, "{}struct {} {{", prefix, name)?;
self.current_namespace.push(name.to_string());
self.out.indent();
self.output_fields(&[name], fields)?;
self.out.unindent();
self.current_namespace.pop();
writeln!(self.out, "}}\n")?;
}
Enum(variants) => {
writeln!(self.out, "{}enum {} {{", prefix, name)?;
self.current_namespace.push(name.to_string());
self.out.indent();
self.output_variants(name, variants)?;
self.out.unindent();
self.current_namespace.pop();
writeln!(self.out, "}}\n")?;
}
}
self.output_custom_code(name)
}