in serde-generate/src/typescript.rs [357:465]
fn output_deserialization_helper(&mut self, name: &str, format0: &Format) -> Result<()> {
use Format::*;
write!(
self.out,
"static deserialize{}(deserializer: Deserializer): {} {{",
name.to_camel_case(),
self.quote_type(format0),
)?;
self.out.indent();
match format0 {
Option(format) => {
write!(
self.out,
r#"
const tag = deserializer.deserializeOptionTag();
if (!tag) {{
return null;
}} else {{
return {};
}}
"#,
self.quote_deserialize(format),
)?;
}
Seq(format) => {
write!(
self.out,
r#"
const length = deserializer.deserializeLen();
const list: {} = [];
for (let i = 0; i < length; i++) {{
list.push({});
}}
return list;
"#,
self.quote_type(format0),
self.quote_deserialize(format)
)?;
}
Map { key, value } => {
write!(
self.out,
r#"
const length = deserializer.deserializeLen();
const obj = new Map<{0}, {1}>();
let previousKeyStart = 0;
let previousKeyEnd = 0;
for (let i = 0; i < length; i++) {{
const keyStart = deserializer.getBufferOffset();
const key = {2};
const keyEnd = deserializer.getBufferOffset();
if (i > 0) {{
deserializer.checkThatKeySlicesAreIncreasing(
[previousKeyStart, previousKeyEnd],
[keyStart, keyEnd]);
}}
previousKeyStart = keyStart;
previousKeyEnd = keyEnd;
const value = {3};
obj.set(key, value);
}}
return obj;
"#,
self.quote_type(key),
self.quote_type(value),
self.quote_deserialize(key),
self.quote_deserialize(value),
)?;
}
Tuple(formats) => {
write!(
self.out,
r#"
return [{}
];
"#,
formats
.iter()
.map(|f| format!("\n {}", self.quote_deserialize(f)))
.collect::<Vec<_>>()
.join(",")
)?;
}
TupleArray { content, size } => {
write!(
self.out,
r#"
const list: {} = [];
for (let i = 0; i < {}; i++) {{
list.push([{}]);
}}
return list;
"#,
self.quote_type(format0),
size,
self.quote_deserialize(content)
)?;
}
_ => panic!("unexpected case"),
}
self.out.unindent();
writeln!(self.out, "}}\n")
}