* Copyright 2016-2017 Gary Kramlich <grim@reaperworld.com> * This program 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. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. func (e *envMapper) Map(name string) string { for _, item := range e.env { if parts := strings.SplitN(item, "=", 2); parts[0] == name { // Map will return the value matching a KEY=VAL pair in the given environment. func Map(key string, env []string) string { // Mapper will replace ${TEMPLATE} patterns in the string with the KEY=VAL pairs // in the given environment. This function will replace patterns recursively, so // if VAL has the form ${TEMPLATE}, it will be replaced again. func Mapper(str string, env []string) (string, error) { next := os.Expand(last, mapper.Map) prev := map[string]struct{}{} if _, ok := prev[next]; ok { return "", fmt.Errorf("infinite environment mapping loop while expanding '%s'", next) next = os.Expand(last, mapper.Map) // SliceMapper calls Mapper for each item in a slice and returns a new slice. func SliceMapper(slice []string, env []string) ([]string, error) { for _, template := range slice { expanded, err := Mapper(template, env) mapped = append(mapped, expanded)