123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package goshared
- const repTpl = `
- {{ $f := .Field }}{{ $r := .Rules }}
- {{ if $r.GetIgnoreEmpty }}
- if len({{ accessor . }}) > 0 {
- {{ end }}
- {{ if $r.GetMinItems }}
- {{ if eq $r.GetMinItems $r.GetMaxItems }}
- if len({{ accessor . }}) != {{ $r.GetMinItems }} {
- err := {{ err . "value must contain exactly " $r.GetMinItems " item(s)" }}
- if !all { return err }
- errors = append(errors, err)
- }
- {{ else if $r.MaxItems }}
- if l := len({{ accessor . }}); l < {{ $r.GetMinItems }} || l > {{ $r.GetMaxItems }} {
- err := {{ err . "value must contain between " $r.GetMinItems " and " $r.GetMaxItems " items, inclusive" }}
- if !all { return err }
- errors = append(errors, err)
- }
- {{ else }}
- if len({{ accessor . }}) < {{ $r.GetMinItems }} {
- err := {{ err . "value must contain at least " $r.GetMinItems " item(s)" }}
- if !all { return err }
- errors = append(errors, err)
- }
- {{ end }}
- {{ else if $r.MaxItems }}
- if len({{ accessor . }}) > {{ $r.GetMaxItems }} {
- err := {{ err . "value must contain no more than " $r.GetMaxItems " item(s)" }}
- if !all { return err }
- errors = append(errors, err)
- }
- {{ end }}
- {{ if $r.GetUnique }}
- {{ lookup $f "Unique" }} := {{ if isBytes $f.Type.Element -}}
- make(map[string]struct{}, len({{ accessor . }}))
- {{ else -}}
- make(map[{{ (typ $f).Element }}]struct{}, len({{ accessor . }}))
- {{ end -}}
- {{ end }}
- {{ if or $r.GetUnique (ne (.Elem "" "").Typ "none") }}
- for idx, item := range {{ accessor . }} {
- _, _ = idx, item
- {{ if $r.GetUnique }}
- if _, exists := {{ lookup $f "Unique" }}[{{ if isBytes $f.Type.Element }}string(item){{ else }}item{{ end }}]; exists {
- err := {{ errIdx . "idx" "repeated value must contain unique items" }}
- if !all { return err }
- errors = append(errors, err)
- } else {
- {{ lookup $f "Unique" }}[{{ if isBytes $f.Type.Element }}string(item){{ else }}item{{ end }}] = struct{}{}
- }
- {{ end }}
- {{ render (.Elem "item" "idx") }}
- }
- {{ end }}
- {{ if $r.GetIgnoreEmpty }}
- }
- {{ end }}
- `
|