in codegen/type_converter.go [1073:1108]
func (f *FieldAssignment) Generate(indent string, uninitialized map[string]*fieldStruct, prevKeyPrefixes []string, useRecurGen bool) string {
var lines = make([]string, 0)
if !f.IsTransform() {
// do an extra nil check for Overrides
if (!f.From.Required && f.To.Required) || f.ExtraNilCheck {
// need to nil check otherwise we could be cast or deref nil
lines = append(lines, indent+"if "+f.FromIdentifier+" != nil {")
lines = append(lines, checkOptionalNil(indent+"\t", uninitialized, f.ToIdentifier, prevKeyPrefixes, useRecurGen)...)
lines = append(lines, formatAssign(indent+"\t", f.ToIdentifier, f.TypeCast, f.FromIdentifier))
lines = append(lines, indent+"}")
} else {
lines = append(lines, checkOptionalNil(indent, uninitialized, f.ToIdentifier, prevKeyPrefixes, useRecurGen)...)
lines = append(lines, formatAssign(indent, f.ToIdentifier, f.TypeCast, f.FromIdentifier))
}
return strings.Join(lines, "\n")
}
// generates nil checks for intermediate objects on the f.FromIdentifier path
checks := convertIdentifiersToNilChecks(getMiddleIdentifiers(f.FromIdentifier))
if !f.ExtraNilCheck {
// if from is required or from/to are both optional then we don't need the final outer check
if f.From.Required || !f.From.Required && !f.To.Required {
checks = checks[:len(checks)-1]
}
if len(checks) == 0 {
lines = append(lines, checkOptionalNil(indent, uninitialized, f.ToIdentifier, prevKeyPrefixes, useRecurGen)...)
lines = append(lines, formatAssign(indent, f.ToIdentifier, f.TypeCast, f.FromIdentifier))
return strings.Join(lines, "\n")
}
}
lines = append(lines, indent+"if "+strings.Join(checks, " && ")+" {")
lines = append(lines, checkOptionalNil(indent+"\t", uninitialized, f.ToIdentifier, prevKeyPrefixes, useRecurGen)...)
lines = append(lines, formatAssign(indent+"\t", f.ToIdentifier, f.TypeCast, f.FromIdentifier))
lines = append(lines, indent+"}")
// TODO else? log? should this silently eat intermediate nils as none-assignment, should set nil?
return strings.Join(lines, "\n")
}