// RecursiveChecker produces Go code that runs the validation checks recursively over the given // attribute. func RecursiveChecker(att *design.AttributeDefinition, nonzero, required bool, target, context string, depth int) string { var checks []string validation := ValidationChecker(att, nonzero, required, target, context, depth) if validation != "" { checks = append(checks, validation) } if o := att.Type.ToObject(); o != nil { if mt, ok := att.Type.(*design.MediaTypeDefinition); ok { att = mt.AttributeDefinition } else if ut, ok := att.Type.(*design.UserTypeDefinition); ok { att = ut.AttributeDefinition } o.IterateAttributes(func(n string, catt *design.AttributeDefinition) error { validation := RecursiveChecker( catt, att.IsNonZero(n), att.IsRequired(n), fmt.Sprintf("%s.%s", target, Goify(n, true)), fmt.Sprintf("%s.%s", context, n), depth+1, ) if validation != "" { checks = append(checks, validation) } return nil }) } else if a := att.Type.ToArray(); a != nil { data := map[string]interface{}{ "elemType": a.ElemType, "context": context, "target": target, "depth": 1, } validation := RunTemplate(arrayValT, data) if validation != "" { checks = append(checks, validation) } } return strings.Join(checks, "\n") }