code: func ParseConfig(r io.Reader) (map[string]*ConnectionDetails, error) {
  	tmpl := template.New("test")
  	tmpl.Funcs(map[string]interface{}{
  		"envOr": func(s1, s2 string) string {
  			return envy.Get(s1, s2)
  		},
  		"env": func(s1 string) string {
  			return envy.Get(s1, "")
  		},
  	})
  	b, err := ioutil.ReadAll(r)
  	if err != nil {
  		return nil, errors.WithStack(err)
  	}
  	t, err := tmpl.Parse(string(b))
  	if err != nil {
  		return nil, errors.Wrap(err, "couldn't parse config template")
  	}
  
  	var bb bytes.Buffer
  	err = t.Execute(&bb, nil)
  	if err != nil {
  		return nil, errors.Wrap(err, "couldn't execute config template")
  	}
  
  	deets := map[string]*ConnectionDetails{}
  	err = yaml.Unmarshal(bb.Bytes(), &deets)
  	return deets, errors.Wrap(err, "couldn't unmarshal config to yaml")
  }
docs: // ParseConfig reads the pop config from the given io.Reader and returns
  // the parsed ConnectionDetails map.