code: 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
  }
docs: // processField gets leading name for the env variable and combines the current
  // field's name and generates environment variable names recursively