func (e EnvTree) IsExistingSubTree(keyChain ...string) bool {
	_, exists := e.root.findNodeByKeyChain(&keyChain)
	return exists
}
IsExistingSubTree returns true if key chain has a tree associated or false if not
package envh
import (
	"regexp"
	"strings"
)
type EnvTree struct {
	root *node
}
func NewEnvTree(reg string, delimiter string) (EnvTree, error) {
	r, err := regexp.Compile(reg)
	if err != nil {
		return EnvTree{}, err
	}
	t := createTreeFromDelimiterFilteringByRegexp(r, delimiter)
	return EnvTree{t}, nil
}
func (e EnvTree) FindString(keyChain ...string) (string, error) {
	return getString(getNodeValueByKeyChain(e.root, &keyChain))
}
func (e EnvTree) FindStringUnsecured(keyChain ...string) string {
	if val, err := getString(getNodeValueByKeyChain(e.root, &keyChain)); err == nil {
		return val
	}
	return ""
}
func (e EnvTree) FindInt(keyChain ...string) (int, error) {
	return getInt(getNodeValueByKeyChain(e.root, &keyChain))
}
func (e EnvTree) FindIntUnsecured(keyChain ...string) int {
	if val, err := getInt(getNodeValueByKeyChain(e.root, &keyChain)); err == nil {
		return val
	}
	return 0
}
func (e EnvTree) FindFloat(keyChain ...string) (float32, error) {
	return getFloat(getNodeValueByKeyChain(e.root, &keyChain))
}
func (e EnvTree) FindFloatUnsecured(keyChain ...string) float32 {
	if val, err := getFloat(getNodeValueByKeyChain(e.root, &keyChain)); err == nil {
		return val
	}
	return 0
}
func (e EnvTree) FindBool(keyChain ...string) (bool, error) {
	return getBool(getNodeValueByKeyChain(e.root, &keyChain))
}
func (e EnvTree) FindBoolUnsecured(keyChain ...string) bool {
	if val, err := getBool(getNodeValueByKeyChain(e.root, &keyChain)); err == nil {
		return val
	}
	return false
}