github.com/ezbercih/terraform@v0.1.1-0.20140729011846-3c33865e0839/command/flag_var.go (about) 1 package command 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/mitchellh/go-libucl" 8 ) 9 10 // FlagVar is a flag.Value implementation for parsing user variables 11 // from the command-line in the format of '-var key=value'. 12 type FlagVar map[string]string 13 14 func (v *FlagVar) String() string { 15 return "" 16 } 17 18 func (v *FlagVar) Set(raw string) error { 19 idx := strings.Index(raw, "=") 20 if idx == -1 { 21 return fmt.Errorf("No '=' value in arg: %s", raw) 22 } 23 24 if *v == nil { 25 *v = make(map[string]string) 26 } 27 28 key, value := raw[0:idx], raw[idx+1:] 29 (*v)[key] = value 30 return nil 31 } 32 33 // FlagVarFile is a flag.Value implementation for parsing user variables 34 // from the command line in the form of files. i.e. '-var-file=foo' 35 type FlagVarFile map[string]string 36 37 func (v *FlagVarFile) String() string { 38 return "" 39 } 40 41 func (v *FlagVarFile) Set(raw string) error { 42 vs, err := loadVarFile(raw) 43 if err != nil { 44 return err 45 } 46 47 if *v == nil { 48 *v = make(map[string]string) 49 } 50 51 for key, value := range vs { 52 (*v)[key] = value 53 } 54 55 return nil 56 } 57 58 const libuclParseFlags = libucl.ParserNoTime 59 60 func loadVarFile(path string) (map[string]string, error) { 61 var obj *libucl.Object 62 63 parser := libucl.NewParser(libuclParseFlags) 64 err := parser.AddFile(path) 65 if err == nil { 66 obj = parser.Object() 67 defer obj.Close() 68 } 69 defer parser.Close() 70 71 if err != nil { 72 return nil, err 73 } 74 75 var result map[string]string 76 if err := obj.Decode(&result); err != nil { 77 return nil, err 78 } 79 80 return result, nil 81 }