|  | package tfexec | 
|  |  | 
|  | import ( | 
|  | "context" | 
|  | "fmt" | 
|  | "os/exec" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | type graphConfig struct { | 
|  | plan       string | 
|  | drawCycles bool | 
|  | graphType  string | 
|  | } | 
|  |  | 
|  | var defaultGraphOptions = graphConfig{} | 
|  |  | 
|  | type GraphOption interface { | 
|  | configureGraph(*graphConfig) | 
|  | } | 
|  |  | 
|  | func (opt *GraphPlanOption) configureGraph(conf *graphConfig) { | 
|  | conf.plan = opt.file | 
|  | } | 
|  |  | 
|  | func (opt *DrawCyclesOption) configureGraph(conf *graphConfig) { | 
|  | conf.drawCycles = opt.drawCycles | 
|  | } | 
|  |  | 
|  | func (opt *GraphTypeOption) configureGraph(conf *graphConfig) { | 
|  | conf.graphType = opt.graphType | 
|  | } | 
|  |  | 
|  | func (tf *Terraform) Graph(ctx context.Context, opts ...GraphOption) (string, error) { | 
|  | graphCmd, err := tf.graphCmd(ctx, opts...) | 
|  | if err != nil { | 
|  | return "", err | 
|  | } | 
|  | var outBuf strings.Builder | 
|  | graphCmd.Stdout = &outBuf | 
|  | err = tf.runTerraformCmd(ctx, graphCmd) | 
|  | if err != nil { | 
|  | return "", err | 
|  | } | 
|  |  | 
|  | return outBuf.String(), nil | 
|  |  | 
|  | } | 
|  |  | 
|  | func (tf *Terraform) graphCmd(ctx context.Context, opts ...GraphOption) (*exec.Cmd, error) { | 
|  | c := defaultGraphOptions | 
|  |  | 
|  | for _, o := range opts { | 
|  | o.configureGraph(&c) | 
|  | } | 
|  |  | 
|  | args := []string{"graph"} | 
|  |  | 
|  | if c.plan != "" { | 
|  | // plan was a positional arguement prior to Terraform 0.15.0. Ensure proper use by checking version. | 
|  | if err := tf.compatible(ctx, tf0_15_0, nil); err == nil { | 
|  | args = append(args, "-plan="+c.plan) | 
|  | } else { | 
|  | args = append(args, c.plan) | 
|  | } | 
|  | } | 
|  |  | 
|  | if c.drawCycles { | 
|  | err := tf.compatible(ctx, tf0_5_0, nil) | 
|  | if err != nil { | 
|  | return nil, fmt.Errorf("-draw-cycles was first introduced in Terraform 0.5.0: %w", err) | 
|  | } | 
|  | args = append(args, "-draw-cycles") | 
|  | } | 
|  |  | 
|  | if c.graphType != "" { | 
|  | err := tf.compatible(ctx, tf0_8_0, nil) | 
|  | if err != nil { | 
|  | return nil, fmt.Errorf("-graph-type was first introduced in Terraform 0.8.0: %w", err) | 
|  | } | 
|  | args = append(args, "-type="+c.graphType) | 
|  | } | 
|  |  | 
|  | return tf.buildTerraformCmd(ctx, nil, args...), nil | 
|  | } |