github.com/danrjohnson/terraform@v0.7.0-rc2.0.20160627135212-d0fc1fa086ff/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 }