in serde-generate/src/csharp.rs [522:631]
fn output_deserialization_helper(&mut self, name: &str, format0: &Format) -> Result<()> {
use Format::*;
write!(
self.out,
"public static {} deserialize_{}(Serde.IDeserializer deserializer) {{",
self.quote_type(format0),
name,
)?;
self.out.indent();
match format0 {
Option(format) => {
write!(
self.out,
r#"
bool tag = deserializer.deserialize_option_tag();
if (!tag) {{
return Serde.Option<{0}>.None;
}} else {{
return Serde.Option<{0}>.Some({1});
}}
"#,
self.quote_type(format),
self.quote_deserialize(format),
)?;
}
Seq(format) => {
write!(
self.out,
r#"
long length = deserializer.deserialize_len();
{0}[] obj = new {0}[length];
for (int i = 0; i < length; i++) {{
obj[i] = {1};
}}
return new Serde.ValueArray<{0}>(obj);
"#,
self.quote_type(format),
self.quote_deserialize(format)
)?;
}
Map { key, value } => {
write!(
self.out,
r#"
long length = deserializer.deserialize_len();
var obj = new Dictionary<{0}, {1}>();
int previous_key_start = 0;
int previous_key_end = 0;
for (long i = 0; i < length; i++) {{
int key_start = deserializer.get_buffer_offset();
var key = {2};
int key_end = deserializer.get_buffer_offset();
if (i > 0) {{
deserializer.check_that_key_slices_are_increasing(
new Serde.Range(previous_key_start, previous_key_end),
new Serde.Range(key_start, key_end));
}}
previous_key_start = key_start;
previous_key_end = key_end;
var value = {3};
obj[key] = value;
}}
return new Serde.ValueDictionary<{0}, {1}>(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#"
{0}[] obj = new {0}[{1}];
for (int i = 0; i < {1}; i++) {{
obj[i] = {2};
}}
return new Serde.ValueArray<{0}>(obj);
"#,
self.quote_type(content),
size,
self.quote_deserialize(content)
)?;
}
_ => panic!("unexpected case"),
}
self.out.unindent();
writeln!(self.out, "}}\n")
}