github.com/meteor/terraform@v0.6.15-0.20210412225145-79ec4bc057c6/command/env_select.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/mitchellh/cli"
     8  )
     9  
    10  type EnvSelectCommand struct {
    11  	Meta
    12  }
    13  
    14  func (c *EnvSelectCommand) Run(args []string) int {
    15  	args = c.Meta.process(args, true)
    16  
    17  	cmdFlags := c.Meta.flagSet("env select")
    18  	cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
    19  	if err := cmdFlags.Parse(args); err != nil {
    20  		return 1
    21  	}
    22  	args = cmdFlags.Args()
    23  	if len(args) == 0 {
    24  		c.Ui.Error("Expected a single argument: NAME.\n")
    25  		return cli.RunResultHelp
    26  	}
    27  
    28  	configPath, err := ModulePath(args[1:])
    29  	if err != nil {
    30  		c.Ui.Error(err.Error())
    31  		return 1
    32  	}
    33  
    34  	current, isOverridden := c.EnvWithIsOverridden()
    35  	if isOverridden {
    36  		c.Ui.Error(envIsOverriddenSelectError)
    37  		return 1
    38  	}
    39  
    40  	// Load the backend
    41  	b, err := c.Backend(&BackendOpts{ConfigPath: configPath})
    42  	if err != nil {
    43  		c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err))
    44  		return 1
    45  	}
    46  
    47  	name := args[0]
    48  	if !validEnvName(name) {
    49  		c.Ui.Error(fmt.Sprintf(envInvalidName, name))
    50  		return 1
    51  	}
    52  
    53  	states, err := b.States()
    54  	if err != nil {
    55  		c.Ui.Error(err.Error())
    56  		return 1
    57  	}
    58  
    59  	if name == current {
    60  		// already using this env
    61  		return 0
    62  	}
    63  
    64  	found := false
    65  	for _, s := range states {
    66  		if name == s {
    67  			found = true
    68  			break
    69  		}
    70  	}
    71  
    72  	if !found {
    73  		c.Ui.Error(fmt.Sprintf(envDoesNotExist, name))
    74  		return 1
    75  	}
    76  
    77  	err = c.SetEnv(name)
    78  	if err != nil {
    79  		c.Ui.Error(err.Error())
    80  		return 1
    81  	}
    82  
    83  	c.Ui.Output(
    84  		c.Colorize().Color(
    85  			fmt.Sprintf(envChanged, name),
    86  		),
    87  	)
    88  
    89  	return 0
    90  }
    91  
    92  func (c *EnvSelectCommand) Help() string {
    93  	helpText := `
    94  Usage: terraform env select NAME [DIR]
    95  
    96    Change Terraform environment.
    97  `
    98  	return strings.TrimSpace(helpText)
    99  }
   100  
   101  func (c *EnvSelectCommand) Synopsis() string {
   102  	return "Change environments"
   103  }