From 9ef0885cca3fb4639e0695665033ca8f5aa703c8 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Thu, 30 Sep 2021 10:48:27 +0800 Subject: [PATCH] fix: parse map key --- parser.go | 13 ++++++++++++- parser_test.go | 8 +++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/parser.go b/parser.go index d19b9e08..7eb381e2 100644 --- a/parser.go +++ b/parser.go @@ -39,6 +39,8 @@ func parseHeaders(rawHeaders map[string]string, variablesMapping map[string]inte if value, ok := parsedValue.(string); ok { parsedHeaders[k] = value } else { + // parsed value is not string, e.g. int, float, etc. + // convert to string parsedHeaders[k] = fmt.Sprintf("%v", parsedValue) } } @@ -55,8 +57,17 @@ func parseData(raw interface{}, variablesMapping map[string]interface{}) interfa case reflect.Map: // convert any map to map[string]interface{} parsedMap := make(map[string]interface{}) for _, k := range rawValue.MapKeys() { + parsedKey := parseString(k.String(), variablesMapping) v := rawValue.MapIndex(k) - parsedMap[k.String()] = parseData(v.Interface(), variablesMapping) + parsedValue := parseData(v.Interface(), variablesMapping) + + if key, ok := parsedKey.(string); ok { + parsedMap[key] = parsedValue + } else { + // parsed key is not string, e.g. int, float, etc. + // convert to string + parsedMap[fmt.Sprintf("%v", parsedKey)] = parsedValue + } } return parsedMap default: diff --git a/parser_test.go b/parser_test.go index c3a3423e..b6e1110c 100644 --- a/parser_test.go +++ b/parser_test.go @@ -134,7 +134,7 @@ func TestParseDataMapWithVariables(t *testing.T) { variablesMapping := map[string]interface{}{ "var1": "foo1", "val1": 200, - "var2": 123, + "var2": 123, // key is int } testData := []struct { @@ -143,8 +143,10 @@ func TestParseDataMapWithVariables(t *testing.T) { }{ {map[string]interface{}{"key": "$var1"}, map[string]interface{}{"key": "foo1"}}, {map[string]interface{}{"foo1": "$val1", "foo2": "bar2"}, map[string]interface{}{"foo1": 200, "foo2": "bar2"}}, - // {map[string]interface{}{"$var1": "$val1"}, map[string]interface{}{"foo1": 200}}, - // {map[string]interface{}{"$var2": "$val1"}, map[string]interface{}{123: 200}}, + // parse map key + {map[string]interface{}{"$var1": "$val1"}, map[string]interface{}{"foo1": 200}}, + // map key is int + {map[string]interface{}{"$var2": "$val1"}, map[string]interface{}{"123": 200}}, } for _, data := range testData {