github.com/Hashicorp/terraform@v0.11.12-beta1/helper/variables/flag_file.go (about)

     1  package variables
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  
     7  	"github.com/hashicorp/hcl"
     8  	"github.com/mitchellh/go-homedir"
     9  )
    10  
    11  // FlagFile is a flag.Value implementation for parsing user variables
    12  // from the command line in the form of files. i.e. '-var-file=foo'
    13  type FlagFile map[string]interface{}
    14  
    15  func (v *FlagFile) String() string {
    16  	return ""
    17  }
    18  
    19  func (v *FlagFile) Set(raw string) error {
    20  	vs, err := loadKVFile(raw)
    21  	if err != nil {
    22  		return err
    23  	}
    24  
    25  	*v = Merge(*v, vs)
    26  	return nil
    27  }
    28  
    29  func loadKVFile(rawPath string) (map[string]interface{}, error) {
    30  	path, err := homedir.Expand(rawPath)
    31  	if err != nil {
    32  		return nil, fmt.Errorf(
    33  			"Error expanding path: %s", err)
    34  	}
    35  
    36  	// Read the HCL file and prepare for parsing
    37  	d, err := ioutil.ReadFile(path)
    38  	if err != nil {
    39  		return nil, fmt.Errorf(
    40  			"Error reading %s: %s", path, err)
    41  	}
    42  
    43  	// Parse it
    44  	obj, err := hcl.Parse(string(d))
    45  	if err != nil {
    46  		return nil, fmt.Errorf(
    47  			"Error parsing %s: %s", path, err)
    48  	}
    49  
    50  	var result map[string]interface{}
    51  	if err := hcl.DecodeObject(&result, obj); err != nil {
    52  		return nil, fmt.Errorf(
    53  			"Error decoding Terraform vars file: %s\n\n"+
    54  				"The vars file should be in the format of `key = \"value\"`.\n"+
    55  				"Decoding errors are usually caused by an invalid format.",
    56  			err)
    57  	}
    58  
    59  	err = flattenMultiMaps(result)
    60  	if err != nil {
    61  		return nil, err
    62  	}
    63  
    64  	return result, nil
    65  }