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  }