// RecursiveChecker produces Go code that runs the validation checks recursively over the given // attribute. func RecursiveChecker(att *design.AttributeDefinition, required bool, target, context string, depth int) string { var checks []string validation := ValidationChecker(att, required, target, context, depth) if validation != "" { checks = append(checks, validation) } if o := att.Type.ToObject(); o != nil { o.IterateAttributes(func(n string, catt *design.AttributeDefinition) error { validation := RecursiveChecker( catt, 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{}{ "attribute": att, "context": context, "target": target, "depth": 1, } validation := runTemplate(arrayValT, data) if validation != "" { checks = append(checks, validation) } } return strings.Join(checks, "\n") }
func paramsFromDefinition(params *design.AttributeDefinition, path string) ([]*Parameter, error) { if params == nil { return nil, nil } obj := params.Type.ToObject() if obj == nil { return nil, fmt.Errorf("invalid parameters definition, not an object") } res := make([]*Parameter, len(obj)) i := 0 wildcards := design.ExtractWildcards(path) obj.IterateAttributes(func(n string, at *design.AttributeDefinition) error { in := "query" required := params.IsRequired(n) for _, w := range wildcards { if n == w { in = "path" required = true break } } param := &Parameter{ Name: n, Default: at.DefaultValue, Description: at.Description, Required: required, In: in, Type: at.Type.Name(), } var items *Items if at.Type.IsArray() { items = itemsFromDefinition(at) } param.Items = items initValidations(at, param) res[i] = param i++ return nil }) return res, nil }
var _ = Describe("IsRequired", func() { var required string var attName string var attribute *design.AttributeDefinition var res bool JustBeforeEach(func() { integer := &design.AttributeDefinition{Type: design.Integer} attribute = &design.AttributeDefinition{ Type: design.Object{required: integer}, Validations: []design.ValidationDefinition{ &design.RequiredValidationDefinition{Names: []string{required}}, }, } res = attribute.IsRequired(attName) }) Context("called on a required field", func() { BeforeEach(func() { attName = "required" required = "required" }) It("returns true", func() { Ω(res).Should(BeTrue()) }) }) Context("called on a non-required field", func() { BeforeEach(func() {