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

Commit

Permalink
Merge pull request #18 from nandlabs/neo/codec
Browse files Browse the repository at this point in the history
  • Loading branch information
nandagopalan authored Dec 20, 2022
2 parents 2a7d42f + ddfec46 commit a4151ed
Show file tree
Hide file tree
Showing 7 changed files with 459 additions and 364 deletions.
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

0 comments on commit a4151ed

Please sign in to comment.