in serde-generate/src/typescript.rs [506:607]
fn output_struct_or_variant_container(
&mut self,
variant_base: Option<&str>,
variant_index: Option<u32>,
name: &str,
fields: &[Named<Format>],
) -> Result<()> {
let mut variant_base_name = format!("");
// Beginning of class
if let Some(base) = variant_base {
writeln!(self.out)?;
self.output_comment(name)?;
writeln!(
self.out,
"export class {0}Variant{1} extends {0} {{",
base, name
)?;
variant_base_name = format!("{0}Variant", base);
} else {
self.output_comment(name)?;
writeln!(self.out, "export class {} {{", name)?;
}
if !fields.is_empty() {
writeln!(self.out)?;
}
// Constructor.
writeln!(
self.out,
"constructor ({}) {{",
fields
.iter()
.map(|f| { format!("public {}: {}", &f.name, self.quote_type(&f.value)) })
.collect::<Vec<_>>()
.join(", ")
)?;
if let Some(_base) = variant_base {
self.out.indent();
writeln!(self.out, "super();")?;
self.out.unindent();
}
writeln!(self.out, "}}\n")?;
// Serialize
if self.generator.config.serialization {
writeln!(
self.out,
"public serialize(serializer: Serializer): void {{",
)?;
self.out.indent();
if let Some(index) = variant_index {
writeln!(self.out, "serializer.serializeVariantIndex({});", index)?;
}
for field in fields {
writeln!(
self.out,
"{}",
self.quote_serialize_value(&field.name, &field.value, true)
)?;
}
self.out.unindent();
writeln!(self.out, "}}\n")?;
}
// Deserialize (struct) or Load (variant)
if self.generator.config.serialization {
if variant_index.is_none() {
writeln!(
self.out,
"static deserialize(deserializer: Deserializer): {} {{",
name,
)?;
} else {
writeln!(
self.out,
"static load(deserializer: Deserializer): {}{} {{",
variant_base_name, name,
)?;
}
self.out.indent();
for field in fields {
writeln!(
self.out,
"const {} = {};",
field.name,
self.quote_deserialize(&field.value)
)?;
}
writeln!(
self.out,
r#"return new {0}{1}({2});"#,
variant_base_name,
name,
fields
.iter()
.map(|f| f.name.to_string())
.collect::<Vec<_>>()
.join(",")
)?;
self.out.unindent();
writeln!(self.out, "}}\n")?;
}
writeln!(self.out, "}}")
}