|
18 | 18 | package generator |
19 | 19 |
|
20 | 20 | import ( |
| 21 | + "encoding/json" |
21 | 22 | "fmt" |
22 | 23 | "go/types" |
23 | 24 | "io" |
@@ -45,10 +46,14 @@ for _, elem := range val.%s{ |
45 | 46 | switch rule.name { |
46 | 47 | case tagMinLength, tagMaxLength: |
47 | 48 | err = sliceRuleMinMaxLength(w, f, rule) |
| 49 | + case tagMinVals: |
| 50 | + err = sliceRuleMinVals(w, f, rule) |
48 | 51 | case tagRequired: |
49 | 52 | sliceRuleRequired(w, f, rule) |
50 | 53 | case tagRequiredAnyOf: |
51 | 54 | err = ruleRequiredOneOf(w, fields, rule.value) |
| 55 | + case tagRequiredIfAny: |
| 56 | + err = ruleRequiredIfAny(w, fields, f, rule.value) |
52 | 57 | default: |
53 | 58 | return errors.Wrap(errUnhandledTagRule(rule), "slice") |
54 | 59 | } |
@@ -79,6 +84,17 @@ for _, elem := range val.%s{ |
79 | 84 | return fmt.Errorf("unhandled tag rule max for type %s", f.Type().Underlying()) |
80 | 85 | } |
81 | 86 |
|
| 87 | +func sliceRuleMinVals(w io.Writer, f structField, rule validationRule) error { |
| 88 | + fmt.Fprintf(w, ` |
| 89 | +for _, elem := range val.%s{ |
| 90 | + if elem %s %s{ |
| 91 | + return fmt.Errorf("'%s': validation rule '%s(%s)' violated") |
| 92 | + } |
| 93 | +} |
| 94 | +`[1:], f.Name(), ruleMinMaxOperator(rule.name), rule.value, jsonName(f), rule.name, rule.value) |
| 95 | + return nil |
| 96 | +} |
| 97 | + |
82 | 98 | func sliceRuleRequired(w io.Writer, f structField, rule validationRule) { |
83 | 99 | fmt.Fprintf(w, ` |
84 | 100 | if len(val.%s) == 0{ |
@@ -110,11 +126,19 @@ func generateJSONPropertySlice(info *fieldInfo, parent *property, child *propert |
110 | 126 | // NOTE(simi): set required=true to be aligned with previous JSON schema definitions |
111 | 127 | items := property{Type: &propertyType{names: []propertyTypeName{itemsType}, required: true}} |
112 | 128 | switch itemsType { |
| 129 | + case TypeNameInteger: |
| 130 | + setPropertyRulesInteger(info, &items) |
| 131 | + case TypeNameNumber: |
| 132 | + setPropertyRulesNumber(info, &items) |
113 | 133 | case TypeNameString: |
114 | 134 | setPropertyRulesString(info, &items) |
115 | 135 | default: |
116 | 136 | return fmt.Errorf("unhandled slice item type %s", itemsType) |
117 | 137 | } |
| 138 | + if minVals, ok := info.tags[tagMinVals]; ok { |
| 139 | + items.Min = json.Number(minVals) |
| 140 | + delete(info.tags, tagMinVals) |
| 141 | + } |
118 | 142 | child.Items = &items |
119 | 143 | return nil |
120 | 144 | } |
0 commit comments