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  }