|  | 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...) | 
|  | } |