64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package tfexec
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"os/exec"
|
|
)
|
|
|
|
type outputConfig struct {
|
|
state string
|
|
json bool
|
|
}
|
|
|
|
var defaultOutputOptions = outputConfig{}
|
|
|
|
// OutputOption represents options used in the Output method.
|
|
type OutputOption interface {
|
|
configureOutput(*outputConfig)
|
|
}
|
|
|
|
func (opt *StateOption) configureOutput(conf *outputConfig) {
|
|
conf.state = opt.path
|
|
}
|
|
|
|
// OutputMeta represents the JSON output of 'terraform output -json',
|
|
// which resembles state format version 3 due to a historical accident.
|
|
// Please see hashicorp/terraform/command/output.go.
|
|
// TODO KEM: Should this type be in terraform-json?
|
|
type OutputMeta struct {
|
|
Sensitive bool `json:"sensitive"`
|
|
Type json.RawMessage `json:"type"`
|
|
Value json.RawMessage `json:"value"`
|
|
}
|
|
|
|
// Output represents the terraform output subcommand.
|
|
func (tf *Terraform) Output(ctx context.Context, opts ...OutputOption) (map[string]OutputMeta, error) {
|
|
outputCmd := tf.outputCmd(ctx, opts...)
|
|
|
|
outputs := map[string]OutputMeta{}
|
|
err := tf.runTerraformCmdJSON(ctx, outputCmd, &outputs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return outputs, nil
|
|
}
|
|
|
|
func (tf *Terraform) outputCmd(ctx context.Context, opts ...OutputOption) *exec.Cmd {
|
|
c := defaultOutputOptions
|
|
|
|
for _, o := range opts {
|
|
o.configureOutput(&c)
|
|
}
|
|
|
|
args := []string{"output", "-no-color", "-json"}
|
|
|
|
// string opts: only pass if set
|
|
if c.state != "" {
|
|
args = append(args, "-state="+c.state)
|
|
}
|
|
|
|
return tf.buildTerraformCmd(ctx, nil, args...)
|
|
}
|