fn output_deserialization_helper()

in serde-generate/src/golang.rs [429:544]


    fn output_deserialization_helper(&mut self, name: &str, format0: &Format) -> Result<()> {
        use Format::*;

        write!(
            self.out,
            "func deserialize_{}(deserializer serde.Deserializer) ({}, error) {{",
            name,
            self.quote_type(format0),
        )?;
        self.out.indent();
        match format0 {
            Option(format) => {
                write!(
                    self.out,
                    r#"
tag, err := deserializer.DeserializeOptionTag()
if err != nil {{ return nil, err }}
if tag {{
	value := new({})
	{}
        return value, nil
}} else {{
	return nil, nil
}}
"#,
                    self.quote_type(format),
                    self.quote_deserialize(format, "*value", "nil"),
                )?;
            }

            Seq(format) => {
                write!(
                    self.out,
                    r#"
length, err := deserializer.DeserializeLen()
if err != nil {{ return nil, err }}
obj := make([]{}, length)
for i := range(obj) {{
	{}
}}
return obj, nil
"#,
                    self.quote_type(format),
                    self.quote_deserialize(format, "obj[i]", "nil")
                )?;
            }

            Map { key, value } => {
                write!(
                    self.out,
                    r#"
length, err := deserializer.DeserializeLen()
if err != nil {{ return nil, err }}
obj := make(map[{0}]{1})
previous_slice := serde.Slice {{ 0, 0 }}
for i := 0; i < int(length); i++ {{
	var slice serde.Slice
	slice.Start = deserializer.GetBufferOffset()
	var key {0}
	{2}
	slice.End = deserializer.GetBufferOffset()
	if i > 0 {{
		err := deserializer.CheckThatKeySlicesAreIncreasing(previous_slice, slice)
		if err != nil {{ return nil, err }}
	}}
	previous_slice = slice
	{3}
}}
return obj, nil
"#,
                    self.quote_type(key),
                    self.quote_type(value),
                    self.quote_deserialize(key, "key", "nil"),
                    self.quote_deserialize(value, "obj[key]", "nil"),
                )?;
            }

            Tuple(formats) => {
                write!(
                    self.out,
                    r#"
var obj {}
{}
return obj, nil
"#,
                    self.quote_type(format0),
                    formats
                        .iter()
                        .enumerate()
                        .map(|(i, f)| self.quote_deserialize(f, &format!("obj.Field{}", i), "obj"))
                        .collect::<Vec<_>>()
                        .join("\n")
                )?;
            }

            TupleArray { content, size } => {
                write!(
                    self.out,
                    r#"
var obj [{1}]{0}
for i := range(obj) {{
	{2}
}}
return obj, nil
"#,
                    self.quote_type(content),
                    size,
                    self.quote_deserialize(content, "obj[i]", "obj")
                )?;
            }

            _ => panic!("unexpected case"),
        }
        self.out.unindent();
        writeln!(self.out, "}}\n")
    }