125 lines
2.8 KiB
Go
125 lines
2.8 KiB
Go
package validation
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// StringList represents a list of StringFields for validating multiple string values
|
|
type StringList struct {
|
|
FieldBase
|
|
Fields []*StringField
|
|
}
|
|
|
|
// newStringList creates a new StringList from form/query values
|
|
func newStringList(key string, g Getter) *StringList {
|
|
items := g.GetList(key)
|
|
list := &StringList{
|
|
FieldBase: newField(key, g),
|
|
Fields: make([]*StringField, 0, len(items)),
|
|
}
|
|
|
|
for _, item := range items {
|
|
if item == "" {
|
|
continue // Skip empty values
|
|
}
|
|
// Create a StringField directly with the value
|
|
field := &StringField{
|
|
Value: item,
|
|
FieldBase: newField(key, g),
|
|
}
|
|
list.Fields = append(list.Fields, field)
|
|
}
|
|
|
|
return list
|
|
}
|
|
|
|
// Values returns all string values in the list
|
|
func (l *StringList) Values() []string {
|
|
values := make([]string, len(l.Fields))
|
|
for i, field := range l.Fields {
|
|
values[i] = field.Value
|
|
}
|
|
return values
|
|
}
|
|
|
|
// Required enforces at least one non-empty value in the list
|
|
func (l *StringList) Required() *StringList {
|
|
if len(l.Fields) == 0 {
|
|
l.getter.AddCheck(newFailedCheck(
|
|
"Field not provided",
|
|
fmt.Sprintf("%s is required", l.Key),
|
|
))
|
|
}
|
|
return l
|
|
}
|
|
|
|
// MinItems enforces a minimum number of items in the list
|
|
func (l *StringList) MinItems(min int) *StringList {
|
|
if len(l.Fields) < min {
|
|
l.getter.AddCheck(newFailedCheck(
|
|
"Too few items",
|
|
fmt.Sprintf("%s requires at least %d item(s)", l.Key, min),
|
|
))
|
|
}
|
|
return l
|
|
}
|
|
|
|
// MaxItems enforces a maximum number of items in the list
|
|
func (l *StringList) MaxItems(max int) *StringList {
|
|
if len(l.Fields) > max {
|
|
l.getter.AddCheck(newFailedCheck(
|
|
"Too many items",
|
|
fmt.Sprintf("%s allows at most %d item(s)", l.Key, max),
|
|
))
|
|
}
|
|
return l
|
|
}
|
|
|
|
// MaxLength enforces a maximum string length for each item
|
|
func (l *StringList) MaxLength(length int) *StringList {
|
|
for _, field := range l.Fields {
|
|
field.MaxLength(length)
|
|
}
|
|
return l
|
|
}
|
|
|
|
// MinLength enforces a minimum string length for each item
|
|
func (l *StringList) MinLength(length int) *StringList {
|
|
for _, field := range l.Fields {
|
|
field.MinLength(length)
|
|
}
|
|
return l
|
|
}
|
|
|
|
// AllowedValues enforces each item must be in the allowed list
|
|
func (l *StringList) AllowedValues(allowed []string) *StringList {
|
|
for _, field := range l.Fields {
|
|
field.AllowedValues(allowed)
|
|
}
|
|
return l
|
|
}
|
|
|
|
// ToUpper transforms all strings to uppercase
|
|
func (l *StringList) ToUpper() *StringList {
|
|
for _, field := range l.Fields {
|
|
field.ToUpper()
|
|
}
|
|
return l
|
|
}
|
|
|
|
// ToLower transforms all strings to lowercase
|
|
func (l *StringList) ToLower() *StringList {
|
|
for _, field := range l.Fields {
|
|
field.ToLower()
|
|
}
|
|
return l
|
|
}
|
|
|
|
// TrimSpace removes leading and trailing whitespace from all items
|
|
func (l *StringList) TrimSpace() *StringList {
|
|
for _, field := range l.Fields {
|
|
field.TrimSpace()
|
|
}
|
|
return l
|
|
}
|