diff --git a/internal/config/config.go b/internal/config/config.go index df5b971ee8..3be23a2451 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -384,14 +384,27 @@ func MergeConfig(configRecords []*fftypes.ConfigRecord) error { if err := json.Unmarshal(c.Value, &val); err != nil { return err } - switch val.(type) { + switch v := val.(type) { case map[string]interface{}: _ = s.ReadConfig(bytes.NewBuffer(c.Value)) for _, k := range s.AllKeys() { - viper.Set(fmt.Sprintf("%s.%s", c.Key, k), s.Get(k)) + value := s.Get(k) + if reflect.TypeOf(value).Kind() == reflect.Slice { + configSlice := value.([]interface{}) + for i := range configSlice { + viper.Set(fmt.Sprintf("%s.%s.%d", c.Key, k, i), configSlice[i]) + } + } else { + viper.Set(fmt.Sprintf("%s.%s", c.Key, k), value) + } + } + case []interface{}: + _ = s.ReadConfig(bytes.NewBuffer(c.Value)) + for i := range v { + viper.Set(fmt.Sprintf("%s.%d", c.Key, i), v[i]) } default: - viper.Set(c.Key, val) + viper.Set(c.Key, v) } } return nil diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 49a7b77f7b..9e2c61ae43 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -187,28 +187,56 @@ func TestMergeConfigOk(t *testing.T) { } } }`) - conf2 := fftypes.Byteable(`{ + confNumber := fftypes.Byteable(`{ "some": { "more": { - "stuff": "value2" + "stuff": 15 } } }`) conf3 := fftypes.Byteable(`"value3"`) + confNestedSlice := fftypes.Byteable(`{ + "nestedslice": [ + { + "firstitemfirstkey": "firstitemfirstkeyvalue", + "firstitemsecondkey": "firstitemsecondkeyvalue" + }, + { + "seconditemfirstkey": "seconditemfirstkeyvalue", + "seconditemsecondkey": "seconditemsecondkeyvalue" + } + ] + }`) + confBaseSlice := fftypes.Byteable(`[ + { + "firstitemfirstkey": "firstitemfirstkeyvalue", + "firstitemsecondkey": "firstitemsecondkeyvalue" + }, + { + "seconditemfirstkey": "seconditemfirstkeyvalue", + "seconditemsecondkey": "seconditemsecondkeyvalue" + } + ]`) viper.Reset() viper.Set("base.something", "value4") err := MergeConfig([]*fftypes.ConfigRecord{ {Key: "base", Value: conf1}, - {Key: "base", Value: conf2}, + {Key: "base", Value: confNumber}, {Key: "base.some.plain", Value: conf3}, + {Key: "base", Value: confNestedSlice}, + {Key: "base.slice", Value: confBaseSlice}, }) assert.NoError(t, err) assert.Equal(t, "value1", viper.Get("base.some.nested.stuff")) - assert.Equal(t, "value2", viper.Get("base.some.more.stuff")) + assert.Equal(t, 15, viper.GetInt("base.some.more.stuff")) assert.Equal(t, "value3", viper.Get("base.some.plain")) assert.Equal(t, "value4", viper.Get("base.something")) + assert.Equal(t, "firstitemfirstkeyvalue", viper.Get("base.nestedslice.0.firstitemfirstkey")) + assert.Equal(t, "seconditemsecondkeyvalue", viper.Get("base.nestedslice.1.seconditemsecondkey")) + assert.Equal(t, "firstitemfirstkeyvalue", viper.Get("base.slice.0.firstitemfirstkey")) + assert.Equal(t, "seconditemsecondkeyvalue", viper.Get("base.slice.1.seconditemsecondkey")) }