in serde-generate/src/java.rs [358:448]
fn output_serialization_helper(&mut self, name: &str, format0: &Format) -> Result<()> {
use Format::*;
write!(
self.out,
"static void serialize_{}({} value, com.novi.serde.Serializer serializer) throws com.novi.serde.SerializationError {{",
name,
self.quote_type(format0)
)?;
self.out.indent();
match format0 {
Option(format) => {
write!(
self.out,
r#"
if (value.isPresent()) {{
serializer.serialize_option_tag(true);
{}
}} else {{
serializer.serialize_option_tag(false);
}}
"#,
self.quote_serialize_value("value.get()", format)
)?;
}
Seq(format) => {
write!(
self.out,
r#"
serializer.serialize_len(value.size());
for ({} item : value) {{
{}
}}
"#,
self.quote_type(format),
self.quote_serialize_value("item", format)
)?;
}
Map { key, value } => {
write!(
self.out,
r#"
serializer.serialize_len(value.size());
int[] offsets = new int[value.size()];
int count = 0;
for (java.util.Map.Entry<{}, {}> entry : value.entrySet()) {{
offsets[count++] = serializer.get_buffer_offset();
{}
{}
}}
serializer.sort_map_entries(offsets);
"#,
self.quote_type(key),
self.quote_type(value),
self.quote_serialize_value("entry.getKey()", key),
self.quote_serialize_value("entry.getValue()", value)
)?;
}
Tuple(formats) => {
writeln!(self.out)?;
for (index, format) in formats.iter().enumerate() {
let expr = format!("value.field{}", index);
writeln!(self.out, "{}", self.quote_serialize_value(&expr, format))?;
}
}
TupleArray { content, size } => {
write!(
self.out,
r#"
if (value.size() != {0}) {{
throw new java.lang.IllegalArgumentException("Invalid length for fixed-size array: " + value.size() + " instead of "+ {0});
}}
for ({1} item : value) {{
{2}
}}
"#,
size,
self.quote_type(content),
self.quote_serialize_value("item", content),
)?;
}
_ => panic!("unexpected case"),
}
self.out.unindent();
writeln!(self.out, "}}\n")
}