Skip to content
This repository has been archived by the owner on Apr 5, 2024. It is now read-only.

updated validator for codec #18

Merged
merged 1 commit into from
Dec 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions codec/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ const (
var DefaultCodecOptions = make(map[string]interface{})

func init() {

DefaultCodecOptions[ValidateOnRead] = defaultValidateOnRead
DefaultCodecOptions[ValidateBefWrite] = defaultValidateBefWrite
}
Expand Down Expand Up @@ -85,7 +84,7 @@ type BaseCodec struct {
readerWriter ReaderWriter
}

//TODO Add error
// TODO Add error
func Get(contentType string, options map[string]interface{}) (c Codec, err error) {
switch contentType {
case JSON:
Expand Down
166 changes: 82 additions & 84 deletions codec/validator/constraints.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,73 +7,42 @@ import (
"strconv"
)

/**
Base Constraints for all Data Types
*/

func required(val reflect.Value, typ reflect.Type, param string) error {
switch typ.Kind() {
case reflect.String:
c, err := convertBool(param)
if err != nil {
return err
}
if c == true {
in, _ := val.Interface().(string)
if in == "" {
return ErrRequired
}
}
case reflect.Bool:
case reflect.Int:
case reflect.Float32:
case reflect.Uint:
}
return nil
}

func nillable(val reflect.Value, typ reflect.Type, param string) error {
return nil
}

func def(val reflect.Value, typ reflect.Type, param string) error {
return nil
}

/**
Numerical Type Constraints
*/

func min(val reflect.Value, typ reflect.Type, param string) error {
return checkMin(val, typ, param, false)
func min(field field, param string) error {
return checkMin(field, param, false)
}

func max(val reflect.Value, typ reflect.Type, param string) error {
return checkMax(val, typ, param, false)
func max(field field, param string) error {
return checkMax(field, param, false)
}

/**
move the below functions to a generic function to consider the both min and exclusive-min
*/
func exclusiveMin(val reflect.Value, typ reflect.Type, param string) error {
return checkMin(val, typ, param, true)
func exclusiveMin(field field, param string) error {
return checkMin(field, param, true)
}

func exclusiveMax(val reflect.Value, typ reflect.Type, param string) error {
return checkMax(val, typ, param, true)
func exclusiveMax(field field, param string) error {
return checkMax(field, param, true)
}

func multipleOf(val reflect.Value, typ reflect.Type, param string) error {
valid := true
in, _ := val.Interface().(int)
c, err := convertInt(param, 0)
cInt := int(c)
if err != nil {
return err
}
valid = in%cInt == 0
if !valid {
return ErrMultipleOf
func multipleOf(field field, param string) error {
// TODO : works only for int as of now
switch field.typ.Kind() {
case reflect.Int:
in, _ := field.value.Interface().(int)
c, err := convertInt(param, 0)
cInt := int(c)
if err != nil {
return err
}
valid := in%cInt == 0
if !valid {
return fmt.Errorf(ErrMultipleOf, field.name)
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}
Expand All @@ -82,56 +51,85 @@ func multipleOf(val reflect.Value, typ reflect.Type, param string) error {
String Type Constraints
*/

func minLength(val reflect.Value, typ reflect.Type, param string) error {
valid := true
lc, _ := strconv.Atoi(param)
lv := len(fmt.Sprint(val))
valid = lv > lc
if !valid {
return ErrMinLength
func notnull(field field, param string) error {
switch field.typ.Kind() {
case reflect.String:
c, err := convertBool(param)
if err != nil {
return fmt.Errorf(ErrBadConstraint, "notnull", param, field.name)
}
if c == true {
in, _ := field.value.Interface().(string)
if in == "" {
return fmt.Errorf(ErrNotNull, field.name)
}
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}

func maxLength(val reflect.Value, typ reflect.Type, param string) error {
valid := true
lc, _ := strconv.Atoi(param)
lv := len(fmt.Sprint(val))
valid = lv < lc
if !valid {
return ErrMaxLength
func minLength(field field, param string) error {
switch field.typ.Kind() {
case reflect.String:
lc, _ := strconv.Atoi(param)
lv := len(fmt.Sprint(field.value))
valid := lv > lc
if !valid {
return fmt.Errorf(ErrMinLength, field.name)
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}

func pattern(val reflect.Value, typ reflect.Type, param string) error {
in, _ := val.Interface().(string)
if typ.Kind() != reflect.String {
return ErrNotSupported
}
re, err := regexp.Compile(param)
if err != nil {
return ErrBadConstraint
func maxLength(field field, param string) error {
switch field.typ.Kind() {
case reflect.String:
lc, _ := strconv.Atoi(param)
lv := len(fmt.Sprint(field.value))
valid := lv < lc
if !valid {
return fmt.Errorf(ErrMaxLength, field.name)
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
if !re.MatchString(in) {
return ErrPattern
return nil
}

func pattern(field field, param string) error {
switch field.typ.Kind() {
case reflect.String:
in, _ := field.value.Interface().(string)
re, err := regexp.Compile(param)
if err != nil {
return fmt.Errorf(ErrBadConstraint, "pattern", param, field.name)
}
if !re.MatchString(in) {
return fmt.Errorf(ErrPattern, field.name)
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}

func enum(val reflect.Value, typ reflect.Type, param string) error {
func enum(field field, param string) error {
flag := false
switch typ.Kind() {
switch field.value.Kind() {
case reflect.Int:
input := val.Interface().(int)
input := field.value.Interface().(int)
flag = checkIfEnumExists(strconv.Itoa(input), param, ",")
case reflect.String:
input := val.String()
input := field.value.String()
flag = checkIfEnumExists(input, param, ",")
}

if flag == false {
return ErrEnums
return fmt.Errorf(ErrEnums, field.name)
}
return nil
}
33 changes: 33 additions & 0 deletions codec/validator/default.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package validator

import "errors"

var (
ErrNotNull = "notnull validation failed for field %s"

ErrMin = "min value validation failed for field %s"

ErrMax = "max value validation failed for field %s"

ErrExclusiveMin = "exclusive min validation failed for field %s"

ErrExclusiveMax = "exclusive max validation failed for field %s"

ErrMultipleOf = "multipleOf validation failed for field %s"

ErrMinLength = "min-length validation failed for field %s"

ErrMaxLength = "max-length validation failed for field %s"

ErrPattern = "pattern validation failed for field %s"

ErrEnums = "enum validation failed for field %s"

ErrBadConstraint = "invalid constraint %s with value '%s' for field %s"

ErrInvalidValidationForField = "invalid validation applied to the field %s"

ErrNotSupported = errors.New("unsupported constraint on type")

ErrConversionFailed = errors.New("conversion failed")
)
43 changes: 0 additions & 43 deletions codec/validator/errMsgs.go

This file was deleted.

Loading