48 lines
1,013 B
Go
48 lines
1,013 B
Go
package mergo_test
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"git.ct129.com/VPN/mergo"
|
|
)
|
|
|
|
type Record struct {
|
|
Data map[string]interface{}
|
|
Mapping map[string]string
|
|
}
|
|
|
|
func StructToRecord(in interface{}) *Record {
|
|
rec := Record{}
|
|
rec.Data = make(map[string]interface{})
|
|
rec.Mapping = make(map[string]string)
|
|
typ := reflect.TypeOf(in)
|
|
for i := 0; i < typ.NumField(); i++ {
|
|
field := typ.Field(i)
|
|
dbFieldName := field.Tag.Get("db")
|
|
if dbFieldName != "" {
|
|
rec.Mapping[field.Name] = dbFieldName
|
|
}
|
|
}
|
|
|
|
if err := mergo.Map(&rec.Data, in); err != nil {
|
|
panic(err)
|
|
}
|
|
return &rec
|
|
}
|
|
|
|
func TestStructToRecord(t *testing.T) {
|
|
type A struct {
|
|
Name string `json:"name" db:"name"`
|
|
CIDR string `json:"cidr" db:"cidr"`
|
|
}
|
|
type Record struct {
|
|
Data map[string]interface{}
|
|
Mapping map[string]string
|
|
}
|
|
a := A{Name: "David", CIDR: "10.0.0.0/8"}
|
|
rec := StructToRecord(a)
|
|
if len(rec.Mapping) < 2 {
|
|
t.Fatalf("struct to record failed, no mapping, struct missing tags?, rec: %+v, a: %+v ", rec, a)
|
|
}
|
|
}
|