// processField gets leading name for the env variable and combines the current // field's name and generates environment variable names recursively func (e *EnvironmentLoader) processField(prefix string, field *structs.Field, name string, strctMap interface{}) error { fieldName := e.generateFieldName(prefix, name) switch strctMap.(type) { case map[string]interface{}: for key, val := range strctMap.(map[string]interface{}) { field := field.Field(key) if err := e.processField(fieldName, field, key, val); err != nil { return err } } default: v := os.Getenv(fieldName) if v == "" { return nil } if err := fieldSet(field, v); err != nil { return err } } return nil }
// printField prints the field of the config struct for the flag.Usage func (e *EnvironmentLoader) printField(prefix string, field *structs.Field, name string, strctMap interface{}) { fieldName := e.generateFieldName(prefix, name) switch strctMap.(type) { case map[string]interface{}: smap := strctMap.(map[string]interface{}) keys := make([]string, 0, len(smap)) for key := range smap { keys = append(keys, key) } sort.Strings(keys) for _, key := range keys { field := field.Field(key) e.printField(fieldName, field, key, smap[key]) } default: fmt.Println(" ", fieldName) } }