Browse Source

Merge pull request #133 from olegator77/fix_toreflect_objmapper

[fix] toReflectValue use fieldNameMapper
Dmitry Panov 5 years ago
parent
commit
c03a5a2d64
2 changed files with 51 additions and 1 deletions
  1. 46 0
      object_goreflect_test.go
  2. 5 1
      runtime.go

+ 46 - 0
object_goreflect_test.go

@@ -540,6 +540,52 @@ func TestGoReflectCustomNaming(t *testing.T) {
 	})
 }
 
+func TestGoReflectCustomObjNaming(t *testing.T) {
+
+	type testStructWithJsonTags struct {
+		A string `json:"b"` // <-- script sees field "A" as property "b"
+	}
+
+	r := New()
+	r.SetFieldNameMapper(&jsonTagNamer{})
+
+	t.Run("Set object in slice", func(t *testing.T) {
+		testSlice := &[]testStructWithJsonTags{{"Hello world"}}
+		r.Set("testslice", testSlice)
+		_, err := r.RunString(`testslice[0] = {b:"setted"}`)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if (*testSlice)[0].A != "setted" {
+			t.Fatalf("Expected \"setted\", got %q", (*testSlice)[0])
+		}
+	})
+
+	t.Run("Set object in map", func(t *testing.T) {
+		testMap := map[string]testStructWithJsonTags{"key": {"Hello world"}}
+		r.Set("testmap", testMap)
+		_, err := r.RunString(`testmap["key"] = {b:"setted"}`)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if testMap["key"].A != "setted" {
+			t.Fatalf("Expected \"setted\", got %q", testMap["key"])
+		}
+	})
+
+	t.Run("Add object to map", func(t *testing.T) {
+		testMap := map[string]testStructWithJsonTags{}
+		r.Set("testmap", testMap)
+		_, err := r.RunString(`testmap["newkey"] = {b:"setted"}`)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if testMap["newkey"].A != "setted" {
+			t.Fatalf("Expected \"setted\", got %q", testMap["newkey"])
+		}
+	})
+}
+
 type fieldNameMapper1 struct{}
 
 func (fieldNameMapper1) FieldName(t reflect.Type, f reflect.StructField) string {

+ 5 - 1
runtime.go

@@ -1338,11 +1338,15 @@ func (r *Runtime) toReflectValue(v Value, typ reflect.Type) (reflect.Value, erro
 			for i := 0; i < typ.NumField(); i++ {
 				field := typ.Field(i)
 				if ast.IsExported(field.Name) {
+					name := field.Name
+					if r.fieldNameMapper != nil {
+						name = r.fieldNameMapper.FieldName(typ, field)
+					}
 					var v Value
 					if field.Anonymous {
 						v = o
 					} else {
-						v = o.self.getStr(field.Name)
+						v = o.self.getStr(name)
 					}
 
 					if v != nil {