func (src NestedParameterMap) DeepEqual(dst NestedParameterMap) bool {
	if len(src) == 0 && len(dst) == 0 {
		return true
	}
	return reflect.DeepEqual(src, dst)
}
DeepEqual compares two nested parameter maps
If both maps are empty (have zero elements), the method will return true
package util
import (
	"fmt"
	"io/ioutil"
	"path/filepath"
	"reflect"
	"strings"
	"github.com/Aptomi/aptomi/pkg/lang/template"
	"github.com/d4l3k/messagediff"
	log "github.com/sirupsen/logrus"
)
type NestedParameterMap map[string]interface{}
func (src *NestedParameterMap) UnmarshalYAML(unmarshal func(interface{}) error) error {
	result := make(map[interface{}]interface{})
	if err := unmarshal(&result); err != nil {
		return err
	}
	*src = NestedParameterMap{}
	put(result, *src, "")
	return nil
}
func put(src interface{}, dst NestedParameterMap, key string) {
	if src == nil {
		return
	}
	if pMap, ok := src.(map[interface{}]interface{}); ok {
		if len(key) > 0 {
			dst = dst.GetNestedMap(key)
		}
		for pKey, pValue := range pMap {
			dst[pKey.(string)] = NestedParameterMap{}
			put(pValue, dst, pKey.(string))
		}
		return
	}
	if srcString, ok := src.(string); ok {
		dst[key] = srcString
		return
	}
	if srcInt, ok := src.(int); ok {
		dst[key] = srcInt
		return
	}
	if srcBool, ok := src.(bool); ok {
		dst[key] = srcBool
		return
	}
	panic("invalid type in NestedParameterMap (expected string, int, or bool)")
}
func (src NestedParameterMap) MakeCopy() NestedParameterMap {
	result := NestedParameterMap{}
	for k, v := range src {
		result[k] = v
	}
	return result
}
func (src NestedParameterMap) GetNestedMap(key string) NestedParameterMap {
	return src[key].(NestedParameterMap)
}