From 16485ba3ca77a4eaf3c0f134b03971eedbba1128 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 9 Jul 2014 15:26:47 -0700 Subject: [PATCH] flatmap: add richer API to resulting flattened map --- flatmap/flatten.go | 4 ++-- flatmap/flatten_test.go | 2 +- flatmap/map.go | 28 ++++++++++++++++++++++++++++ flatmap/map_test.go | 24 ++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 flatmap/map.go create mode 100644 flatmap/map_test.go 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) + } +}