blob: 0e60034e493754af22d40b9e386f33d2a4c1c523 [file]
package tfexec
import (
"context"
"fmt"
"os/exec"
"strconv"
"strings"
)
type addConfig struct {
fromState bool
out string
includeOptional bool
provider string
reattachInfo ReattachInfo
}
var defaultAddOptions = addConfig{}
type AddOption interface {
configureAdd(*addConfig)
}
func (opt *FromStateOption) configureAdd(conf *addConfig) {
conf.fromState = opt.fromState
}
func (opt *OutOption) configureAdd(conf *addConfig) {
conf.out = opt.path
}
func (opt *IncludeOptionalOption) configureAdd(conf *addConfig) {
conf.includeOptional = opt.includeOptional
}
func (opt *ProviderOption) configureAdd(conf *addConfig) {
conf.provider = opt.provider
}
func (opt *ReattachOption) configureAdd(conf *addConfig) {
conf.reattachInfo = opt.info
}
// Add represents the `terraform add` subcommand (added in 1.1.0).
//
// Note that this function signature and behaviour is subject
// to breaking changes including removal of that function
// until final 1.1.0 Terraform version (with this command) is released.
func (tf *Terraform) Add(ctx context.Context, address string, opts ...AddOption) (string, error) {
cmd, err := tf.addCmd(ctx, address, opts...)
if err != nil {
return "", err
}
var outBuf strings.Builder
cmd.Stdout = mergeWriters(cmd.Stdout, &outBuf)
if err := tf.runTerraformCmd(ctx, cmd); err != nil {
return "", err
}
return outBuf.String(), nil
}
func (tf *Terraform) addCmd(ctx context.Context, address string, opts ...AddOption) (*exec.Cmd, error) {
err := tf.compatible(ctx, tf1_1_0, nil)
if err != nil {
return nil, fmt.Errorf("terraform add was added in 1.1.0: %w", err)
}
c := defaultAddOptions
for _, o := range opts {
o.configureAdd(&c)
}
args := []string{"add"}
args = append(args, "-from-state="+strconv.FormatBool(c.fromState))
if c.out != "" {
args = append(args, "-out="+c.out)
}
args = append(args, "-optional="+strconv.FormatBool(c.includeOptional))
if c.provider != "" {
args = append(args, "-provider="+c.provider)
}
args = append(args, address)
mergeEnv := map[string]string{}
if c.reattachInfo != nil {
reattachStr, err := c.reattachInfo.marshalString()
if err != nil {
return nil, err
}
mergeEnv[reattachEnvVar] = reattachStr
}
return tf.buildTerraformCmd(ctx, mergeEnv, args...), nil
}