package forms import ( "fmt" "net/http" "net/url" "strings" "github.com/asaskevich/govalidator" ) // Form creates a custom form struct, embeds a url.Values object type Form struct { url.Values Errors errors } // New initializes a form struct func New(data url.Values) *Form { return &Form{ data, errors(map[string][]string{}), } } // Required checks required fields func (f *Form) Required(fields ...string) { for _, field := range fields { value := f.Get(field) if strings.TrimSpace(value) == "" { f.Errors.Add(field, "This field cannot be blank") } } } // Has checks if form field is in post and not emtpy func (f *Form) Has(field string, r *http.Request) bool { x := r.Form.Get(field) return x != "" } // Valid returns true if there are no errors, otherwise false func (f *Form) Valid() bool { return len(f.Errors) == 0 } // MinLength checks for string minimum length func (f *Form) MinLength(field string, length int, r *http.Request) bool { value := r.Form.Get(field) if len(value) < length { f.Errors.Add(field, fmt.Sprintf("This field must have at least %d letters", length)) return false } return true } // IsEmail checks the email address func (f *Form) IsEmail(field string, r *http.Request) { value := r.Form.Get(field) if !govalidator.IsEmail(value) { f.Errors.Add(field, "Invalid email address") } }