github.com/adrian-bl/terraform@v0.7.0-rc2.0.20160705220747-de0a34fc3517/command/flag_kv.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/hcl"
     9  	"github.com/mitchellh/go-homedir"
    10  )
    11  
    12  // FlagKV is a flag.Value implementation for parsing user variables
    13  // from the command-line in the format of '-var key=value'.
    14  type FlagKV map[string]string
    15  
    16  func (v *FlagKV) String() string {
    17  	return ""
    18  }
    19  
    20  func (v *FlagKV) Set(raw string) error {
    21  	idx := strings.Index(raw, "=")
    22  	if idx == -1 {
    23  		return fmt.Errorf("No '=' value in arg: %s", raw)
    24  	}
    25  
    26  	if *v == nil {
    27  		*v = make(map[string]string)
    28  	}
    29  
    30  	key, value := raw[0:idx], raw[idx+1:]
    31  	(*v)[key] = value
    32  	return nil
    33  }
    34  
    35  // FlagKVFile is a flag.Value implementation for parsing user variables
    36  // from the command line in the form of files. i.e. '-var-file=foo'
    37  type FlagKVFile map[string]string
    38  
    39  func (v *FlagKVFile) String() string {
    40  	return ""
    41  }
    42  
    43  func (v *FlagKVFile) Set(raw string) error {
    44  	vs, err := loadKVFile(raw)
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	if *v == nil {
    50  		*v = make(map[string]string)
    51  	}
    52  
    53  	for key, value := range vs {
    54  		(*v)[key] = value
    55  	}
    56  
    57  	return nil
    58  }
    59  
    60  func loadKVFile(rawPath string) (map[string]string, error) {
    61  	path, err := homedir.Expand(rawPath)
    62  	if err != nil {
    63  		return nil, fmt.Errorf(
    64  			"Error expanding path: %s", err)
    65  	}
    66  
    67  	// Read the HCL file and prepare for parsing
    68  	d, err := ioutil.ReadFile(path)
    69  	if err != nil {
    70  		return nil, fmt.Errorf(
    71  			"Error reading %s: %s", path, err)
    72  	}
    73  
    74  	// Parse it
    75  	obj, err := hcl.Parse(string(d))
    76  	if err != nil {
    77  		return nil, fmt.Errorf(
    78  			"Error parsing %s: %s", path, err)
    79  	}
    80  
    81  	var result map[string]string
    82  	if err := hcl.DecodeObject(&result, obj); err != nil {
    83  		return nil, fmt.Errorf(
    84  			"Error decoding Terraform vars file: %s\n\n"+
    85  				"The vars file should be in the format of `key = \"value\"`.\n"+
    86  				"Decoding errors are usually caused by an invalid format.",
    87  			err)
    88  	}
    89  
    90  	return result, nil
    91  }
    92  
    93  // FlagStringSlice is a flag.Value implementation for parsing targets from the
    94  // command line, e.g. -target=aws_instance.foo -target=aws_vpc.bar
    95  
    96  type FlagStringSlice []string
    97  
    98  func (v *FlagStringSlice) String() string {
    99  	return ""
   100  }
   101  func (v *FlagStringSlice) Set(raw string) error {
   102  	*v = append(*v, raw)
   103  
   104  	return nil
   105  }