summaryrefslogtreecommitdiffstats
path: root/pkg/flatten
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/flatten')
-rw-r--r--pkg/flatten/flatten.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/pkg/flatten/flatten.go b/pkg/flatten/flatten.go
new file mode 100644
index 0000000..a31705b
--- /dev/null
+++ b/pkg/flatten/flatten.go
@@ -0,0 +1,30 @@
+package flatten
+
+import (
+ "strconv"
+)
+
+// Flatten creates flat, one-dimensional maps from arbitrarily nested values, e.g. JSON.
+func Flatten(value interface{}, prefix string) map[string]interface{} {
+ var flatten func(string, interface{})
+ flattened := make(map[string]interface{})
+
+ flatten = func(key string, value interface{}) {
+ switch value := value.(type) {
+ case map[string]interface{}:
+ for k, v := range value {
+ flatten(key+"."+k, v)
+ }
+ case []interface{}:
+ for i, v := range value {
+ flatten(key+"["+strconv.Itoa(i)+"]", v)
+ }
+ default:
+ flattened[key] = value
+ }
+ }
+
+ flatten(prefix, value)
+
+ return flattened
+}