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 }