Example #1
0
// Used to check whether a string has at most N characters
// Fails if data is a string and its length is more than the specified comparator. Passes in all other cases.
func MaxLength(data rules.ValidationData) error {
	v, err := helper.ToString(data.Value)
	if err != nil {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is not a string",
		}
	}

	// We should always be provided with a length to validate against
	if len(data.Args) == 0 {
		return fmt.Errorf("No argument found in the validation struct (eg 'MaxLength:5')")
	}

	// Typecast our argument and test
	var max int
	if max, err = strconv.Atoi(data.Args[0]); err != nil {
		return err
	}
	// Typecast our argument and test

	if len(v) > max {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        fmt.Sprintf("is too long; it must be at most %d characters long", max),
		}
	}

	return nil
}
Example #2
0
// Validates that a string only contains alphabetic characters
func Regexp(data rules.ValidationData) (err error) {
	v, err := helper.ToString(data.Value)
	if err != nil {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is not a string",
		}
	}

	// We should always be provided with a length to validate against
	if len(data.Args) == 0 {
		return fmt.Errorf("No argument found in the validation struct (eg 'Regexp:/^\\s+$/')")
	}

	// Remove the trailing slashes from our regex string. Regexps must be enclosed
	// within two "/" characters.
	re := data.Args[0]
	re = re[1 : len(re)-1]
	if regexp.MustCompile(re).MatchString(v) == false {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "doesn't match regular expression",
		}
	}

	return nil
}
Example #3
0
// Validates a URL using url.Parse() in the net/url library.
// For a valid URL, the following need to be present in a parsed URL:
// * Scheme (either http or https)
// * Host (without a backslash)
func URL(data rules.ValidationData) error {
	v, err := helper.ToString(data.Value)
	if err != nil {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is not a string",
		}
	}

	parsed, err := url.Parse(v)
	if err != nil {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is not a valid URL",
		}
	}

	if parsed.Scheme != "http" && parsed.Scheme != "https" {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        fmt.Sprintf("has an invalid scheme '%s'", parsed.Scheme),
		}
	}

	if parsed.Host == "" || strings.IndexRune(parsed.Host, '\\') > 0 {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        fmt.Sprintf("has an invalid host ('%s')", parsed.Host),
		}
	}

	return nil
}
Example #4
0
// Checks whether a string is empty.
// Passes if the data is a non-empty string. Fails if the data isn't a string, or the data is an empty string.
func NotEmpty(data rules.ValidationData) (err error) {
	v, ok := helper.ToString(data.Value)
	if ok != nil {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is not a string",
		}
	}
	if v == "" {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is empty",
		}
	}
	return nil
}
Example #5
0
// Used to check whether a string has at most N characters
// Fails if data is a string and its length is more than the specified comparator. Passes in all other cases.
func UUID(data rules.ValidationData) error {
	v, err := helper.ToString(data.Value)
	if err != nil {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is not a string",
		}
	}

	if !IsUUID(v) {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is an invalid UUID",
		}
	}

	return nil
}
Example #6
0
func Email(data rules.ValidationData) (err error) {
	v, ok := helper.ToString(data.Value)
	if ok != nil {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is not a string",
		}
	}

	if IsEmail(v) {
		return
	}

	return rules.ErrInvalid{
		ValidationData: data,
		Failure:        "is not a valid email address",
	}
}
Example #7
0
// Validates that a string only contains alphabetic characters
func Alpha(data rules.ValidationData) (err error) {
	v, ok := helper.ToString(data.Value)
	if ok != nil {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "is not a string",
		}
	}

	if regexp.MustCompile(`[^a-zA-Z]+`).MatchString(v) {
		return rules.ErrInvalid{
			ValidationData: data,
			Failure:        "contains non-alphabetic characters",
		}
	}

	return nil
}