Skip to content

Commit

Permalink
update Bind
Browse files Browse the repository at this point in the history
  • Loading branch information
Rhyanz46 committed Jan 14, 2024
1 parent 90dd079 commit 8e9a2b2
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 49 deletions.
85 changes: 47 additions & 38 deletions map_validator/extra_operations.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package map_validator

import (
"encoding/json"
"errors"
"reflect"
)

func (state *extraOperation) Bind(i interface{}) error {
Expand All @@ -11,45 +11,54 @@ func (state *extraOperation) Bind(i interface{}) error {
return errors.New("no data to Bind because last progress is error")
}
data = *state.data // this for memory allocation purpose
allKeysInMap := getAllKeys(data)
val := reflect.ValueOf(i)
if val.Kind() != reflect.Ptr || val.Elem().Kind() != reflect.Struct {
panic("need struct pointer!")
}

el := val.Elem()
t := val.Elem().Type()
//allKeysInMap := getAllKeys(data)
//val := reflect.ValueOf(i)
//if val.Kind() != reflect.Ptr || val.Elem().Kind() != reflect.Struct {
// panic("need struct pointer!")
//}
//
//el := val.Elem()
//t := val.Elem().Type()

for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
tag := field.Tag.Get("map_validator")
if !isDataInList[string](tag, allKeysInMap) {
continue
}
//for i := 0; i < t.NumField(); i++ {
// field := t.Field(i)
// tag := field.Tag.Get("map_validator")
// if !isDataInList[string](tag, allKeysInMap) {
// continue
// }
//
// if tag == "" || !field.IsExported() || data[tag] == nil {
// continue
// }
//
// if field.Type.Kind() == reflect.Ptr && reflect.TypeOf(data[tag]).Kind() == field.Type.Elem().Kind() {
// err := convertValue(data[tag], field.Type.Elem().Kind(), el.Field(i), true)
// if err != nil {
// return err
// }
// } else if field.Type.Kind() == reflect.TypeOf(data[tag]).Kind() &&
// field.Type.Kind() != reflect.Struct {
// err := convertValue(data[tag], field.Type.Kind(), el.Field(i), false)
// if err != nil {
// return err
// }
// } else if field.Type.Kind() == reflect.Interface {
// if reflect.TypeOf(data[tag]).Kind() == reflect.Map {
// err := convertValue(data[tag], field.Type.Kind(), el.Field(i), false)
// if err != nil {
// return err
// }
// }
// }
//}

if tag == "" || !field.IsExported() || data[tag] == nil {
continue
}

if field.Type.Kind() == reflect.Ptr && reflect.TypeOf(data[tag]).Kind() == field.Type.Elem().Kind() {
err := convertValue(data[tag], field.Type.Elem().Kind(), el.Field(i), true)
if err != nil {
return err
}
} else if field.Type.Kind() == reflect.TypeOf(data[tag]).Kind() &&
field.Type.Kind() != reflect.Struct {
err := convertValue(data[tag], field.Type.Kind(), el.Field(i), false)
if err != nil {
return err
}
} else if field.Type.Kind() == reflect.Interface {
if reflect.TypeOf(data[tag]).Kind() == reflect.Map {
err := convertValue(data[tag], field.Type.Kind(), el.Field(i), false)
if err != nil {
return err
}
}
}
jsonStringData, err := json.Marshal(data)
if err != nil {
return err
}
err = json.Unmarshal(jsonStringData, i)
if err != nil {
return err
}

return nil
Expand Down
22 changes: 11 additions & 11 deletions test/modul_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (

func TestMultipleValidation(t *testing.T) {
type Data struct {
JK string `map_validator:"jenis_kelamin"`
Hoby string `map_validator:"hoby"`
Menikah bool `map_validator:"menikah"`
JK string `map_validator:"jenis_kelamin" json:"jenis_kelamin"`
Hoby string `map_validator:"hoby" json:"hoby"`
Menikah bool `map_validator:"menikah" json:"menikah"`
}
validRole := map[string]map_validator.Rules{
"jenis_kelamin": {Enum: &map_validator.EnumField[any]{Items: []string{"laki-laki", "perempuan"}}},
Expand Down Expand Up @@ -119,9 +119,9 @@ func TestMultipleValidation(t *testing.T) {
func TestPointerFieldBinding(t *testing.T) {
payload := map[string]interface{}{"jenis_kelamin": "laki-laki", "hoby": "Main PS bro", "umur": 1, "menikah": true}
type Data struct {
JK string `map_validator:"jenis_kelamin"`
Hoby *string `map_validator:"hoby"`
Menikah bool `map_validator:"menikah"`
JK string `map_validator:"jenis_kelamin" json:"jenis_kelamin"`
Hoby *string `map_validator:"hoby" json:"hoby"`
Menikah bool `map_validator:"menikah" json:"menikah"`
}
validRole := map[string]map_validator.Rules{
"jenis_kelamin": {Enum: &map_validator.EnumField[any]{Items: []string{"laki-laki", "perempuan"}}},
Expand Down Expand Up @@ -158,13 +158,13 @@ func TestPointerFieldBinding(t *testing.T) {

func TestInterfaceFieldBinding(t *testing.T) {
var obj interface{}
obj = map[string]interface{}{"nama": "arian", "kelas": 1}
obj = map[string]interface{}{"nama": "arian", "kelas": float64(1)}
payload := map[string]interface{}{"jenis_kelamin": "laki-laki", "hoby": "Main PS bro", "umur": 1, "menikah": true, "list_data": obj}
type Data struct {
JK string `map_validator:"jenis_kelamin"`
Hoby *string `map_validator:"hoby"`
Menikah bool `map_validator:"menikah"`
ListData interface{} `map_validator:"list_data"`
JK string `map_validator:"jenis_kelamin" json:"jenis_kelamin"`
Hoby *string `map_validator:"hoby" json:"hoby"`
Menikah bool `map_validator:"menikah" json:"menikah"`
ListData interface{} `map_validator:"list_data" json:"list_data"`
}
validRole := map[string]map_validator.Rules{
"jenis_kelamin": {Enum: &map_validator.EnumField[any]{Items: []string{"laki-laki", "perempuan"}}},
Expand Down

0 comments on commit 8e9a2b2

Please sign in to comment.