in serde-generate/src/dart.rs [471:576]
fn output_deserialization_helper(&mut self, name: &str, format0: &Format) -> Result<()> {
use Format::*;
write!(
self.out,
"static {} deserialize{}(BinaryDeserializer deserializer) {{",
self.quote_type(format0),
name.to_camel_case(),
)?;
self.out.indent();
match format0 {
Option(format) => {
write!(
self.out,
r#"
final tag = deserializer.deserializeOptionTag();
if (tag) {{
return {};
}} else {{
return null;
}}
"#,
self.quote_deserialize(format),
)?;
}
Seq(format) => {
write!(
self.out,
r#"
final length = deserializer.deserializeLength();
return List.generate(length, (_i) => {0});
"#,
self.quote_deserialize(format)
)?;
}
Map { key, value } => {
write!(
self.out,
r#"
final length = deserializer.deserializeLength();
final obj = <{0}, {1}>{{}};
var previousKeyStart = 0;
var previousKeyEnd = 0;
for (var i = 0; i < length; i++) {{
final keyStart = deserializer.offset;
{0} key = {2};
final keyEnd = deserializer.offset;
if (i > 0) {{
deserializer.checkThatKeySlicesAreIncreasing(
Slice(previousKeyStart, previousKeyEnd),
Slice(keyStart, keyEnd),
);
}}
previousKeyStart = keyStart;
previousKeyEnd = keyEnd;
{1} value = {3};
obj.putIfAbsent(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 {}({}
);
"#,
self.quote_type(format0),
formats
.iter()
.map(|f| format!("\n {}", self.quote_deserialize(f)))
.collect::<Vec<_>>()
.join(",")
)?;
}
TupleArray { content, size } => {
write!(
self.out,
r#"
final obj = List<{0}>.filled({1}, 0);
for (var i = 0; i < {1}; i++) {{
obj[i] = {2};
}}
return obj;
"#,
self.quote_type(content),
size,
self.quote_deserialize(content)
)?;
}
_ => panic!("unexpected case"),
}
self.out.unindent();
writeln!(self.out, "}}\n")
}