github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/internal/packager/parameter.go (about) 1 package packager 2 3 import ( 4 "fmt" 5 "sort" 6 "strings" 7 8 "github.com/docker/app/types/parameters" 9 ) 10 11 // CNABParametersMapping describes the desired mapping between parameters and CNAB environment variables 12 type CNABParametersMapping struct { 13 CNABEnvToParameter map[string]string 14 ParameterToCNABEnv map[string]string 15 } 16 17 // ExtractCNABParameterMapping extracts the CNABParametersMapping from application parameters 18 func ExtractCNABParameterMapping(parameters parameters.Parameters) CNABParametersMapping { 19 keys := getKeys("", parameters) 20 sort.Strings(keys) 21 mapping := CNABParametersMapping{ 22 CNABEnvToParameter: make(map[string]string), 23 ParameterToCNABEnv: make(map[string]string), 24 } 25 for ix, key := range keys { 26 env := fmt.Sprintf("docker_param%d", ix+1) 27 mapping.CNABEnvToParameter[env] = key 28 mapping.ParameterToCNABEnv[key] = env 29 } 30 return mapping 31 } 32 33 func getKeys(prefix string, parameters map[string]interface{}) []string { 34 var keys []string 35 for k, v := range parameters { 36 sub, ok := v.(map[string]interface{}) 37 if ok { 38 subPrefix := prefix 39 subPrefix += fmt.Sprintf("%s.", k) 40 keys = append(keys, getKeys(subPrefix, sub)...) 41 } else { 42 keys = append(keys, prefix+k) 43 } 44 } 45 return keys 46 } 47 48 // ExtractCNABParametersValues extracts the parameter values from the given CNAB environment 49 func ExtractCNABParametersValues(mapping CNABParametersMapping, env []string) map[string]string { 50 envValues := map[string]string{} 51 for _, v := range env { 52 parts := strings.SplitN(v, "=", 2) 53 if len(parts) == 2 { 54 if key, ok := mapping.CNABEnvToParameter[parts[0]]; ok { 55 envValues[key] = parts[1] 56 } 57 } 58 } 59 return envValues 60 }