diff --git a/flatmap/flatten.go b/flatmap/flatten.go index 71b249117a..9ff6e42652 100644 --- a/flatmap/flatten.go +++ b/flatmap/flatten.go @@ -12,14 +12,14 @@ import ( // any combination of those together. // // See the tests for examples of what inputs are turned into. -func Flatten(thing map[string]interface{}) map[string]string { +func Flatten(thing map[string]interface{}) Map { result := make(map[string]string) for k, raw := range thing { flatten(result, k, reflect.ValueOf(raw)) } - return result + return Map(result) } func flatten(result map[string]string, prefix string, v reflect.Value) { diff --git a/flatmap/flatten_test.go b/flatmap/flatten_test.go index 9f21d23643..1aa4940f89 100644 --- a/flatmap/flatten_test.go +++ b/flatmap/flatten_test.go @@ -77,7 +77,7 @@ func TestFlatten(t *testing.T) { for _, tc := range cases { actual := Flatten(tc.Input) - if !reflect.DeepEqual(actual, tc.Output) { + if !reflect.DeepEqual(actual, Map(tc.Output)) { t.Fatalf( "Input:\n\n%#v\n\nOutput:\n\n%#v\n\nExpected:\n\n%#v\n", tc.Input, diff --git a/flatmap/map.go b/flatmap/map.go new file mode 100644 index 0000000000..cd94980744 --- /dev/null +++ b/flatmap/map.go @@ -0,0 +1,28 @@ +package flatmap + +import ( + "strings" +) + +// Map is a wrapper around map[string]string that provides some helpers +// above it that assume the map is in the format that flatmap expects +// (the result of Flatten). +// +// All modifying functions such as Delete are done in-place unless +// otherwise noted. +type Map map[string]string + +// Delete deletes a key out of the map with the given prefix. +func (m Map) Delete(prefix string) { + for k, _ := range m { + match := k == prefix + if !match && !strings.HasPrefix(k, prefix) { + continue + } + if k[len(prefix):len(prefix)+1] != "." { + continue + } + + delete(m, k) + } +} diff --git a/flatmap/map_test.go b/flatmap/map_test.go new file mode 100644 index 0000000000..4df4ef4103 --- /dev/null +++ b/flatmap/map_test.go @@ -0,0 +1,24 @@ +package flatmap + +import ( + "reflect" + "testing" +) + +func TestMapDelete(t *testing.T) { + m := Flatten(map[string]interface{}{ + "foo": "bar", + "routes": []map[string]string{ + map[string]string{ + "foo": "bar", + }, + }, + }) + + m.Delete("routes") + + expected := Map(map[string]string{"foo": "bar"}) + if !reflect.DeepEqual(m, expected) { + t.Fatalf("bad: %#v", m) + } +}