pkg/sdk/value/flatmap/expand.go (43 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package flatmap import ( "strings" "github.com/elastic/harp/pkg/bundle" ) // Expand takes a map and a key (prefix) and expands that value into // a more complex structure. This is the reverse of the Flatten operation. func Expand(m bundle.KV, key string) interface{} { // If the key is exactly a key in the map, just return it if v, ok := m[key]; ok { if v == "true" { return true } else if v == "false" { return false } return v } // Check if this is a prefix in the map prefix := key if key != "" { prefix = key + "/" } for k := range m { if strings.HasPrefix(k, prefix) { return expandMap(m, prefix) } } return nil } func expandMap(m bundle.KV, prefix string) bundle.KV { result := make(bundle.KV) for k := range m { if !strings.HasPrefix(k, prefix) { // Prefix not found continue } // Remove the prefix key := k[len(prefix):] idx := strings.Index(key, "/") if idx != -1 { key = key[:idx] } if _, ok := result[key]; ok { continue } // Recursive call to handle subtree result[key] = Expand(m, k[:len(prefix)+len(key)]) } return result }