grim/convey

24194ae96f10
Added tag v0.9.1 for changeset 86643e4fda89
/*
* Convey
* 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/>.
*/
package environment
import (
"os"
"strings"
)
type envMapper struct {
env []string
}
func (e *envMapper) Map(name string) string {
for _, item := range e.env {
if parts := strings.SplitN(item, "=", 2); parts[0] == name {
if len(parts) == 2 {
return parts[1]
}
return os.Getenv(name)
}
}
return "$" + name
}
// 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 {
mapper := envMapper{env}
last := str
next := os.Expand(last, mapper.Map)
// TODO - add a max-depth or a list to detect replacement loops
for last != next {
last = next
next = os.Expand(last, mapper.Map)
}
return next
}
// SliceMapper calls Mapper for each item in a slice and returns a new slice.
func SliceMapper(slice []string, env []string) []string {
mapped := []string{}
for _, template := range slice {
mapped = append(mapped, Mapper(template, env))
}
return mapped
}