// Copyright (C) 2016-2019 Vincent Ambo // // This file is part of Kontemplate. // // Kontemplate is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. package util import ( "io/ioutil" "github.com/ghodss/yaml" ) // Filenames excluded from templating for the purpose of containing default variable values inside a resource set. var DefaultFilenames []string = []string{"default.yml", "default.yaml", "default.json"} // Merges two maps together. Values from the second map override values in the first map. // The returned map is new if anything was changed. func Merge(in1 *map[string]interface{}, in2 *map[string]interface{}) *map[string]interface{} { if in1 == nil || len(*in1) == 0 { return in2 } if in2 == nil || len(*in2) == 0 { return in1 } // The maps are map[string]interface{} with unknown depth. // Loop over both maps into every level and merge them. new := make(map[string]interface{}) for k, v := range *in1 { new[k] = v } for k, v := range *in2 { if existing, ok := new[k]; ok { // If both values are maps, merge them recursively if existingMap, ok := existing.(map[string]interface{}); ok { if newMap, ok := v.(map[string]interface{}); ok { new[k] = *Merge(&existingMap, &newMap) } else { new[k] = v } } else { new[k] = v } } else { new[k] = v } } return &new } // Loads either a YAML or JSON file from the specified path and // deserialises it into the provided interface. func LoadData(filename string, addr interface{}) error { file, err := ioutil.ReadFile(filename) if err != nil { return err } err = yaml.Unmarshal(file, addr) if err != nil { return err } return nil }