package tfexec import ( "bytes" "context" "encoding/json" "fmt" tfjson "github.com/hashicorp/terraform-json" ) // Validate represents the validate subcommand to the Terraform CLI. The -json // flag support was added in 0.12.0, so this will not work on earlier versions. func (tf *Terraform) Validate(ctx context.Context) (*tfjson.ValidateOutput, error) { err := tf.compatible(ctx, tf0_12_0, nil) if err != nil { return nil, fmt.Errorf("terraform validate -json was added in 0.12.0: %w", err) } cmd := tf.buildTerraformCmd(ctx, nil, "validate", "-no-color", "-json") var outBuf = bytes.Buffer{} cmd.Stdout = &outBuf err = tf.runTerraformCmd(ctx, cmd) // TODO: this command should not exit 1 if you pass -json as its hard to differentiate other errors if err != nil && cmd.ProcessState.ExitCode() != 1 { return nil, err } var ret tfjson.ValidateOutput // TODO: ret.UseJSONNumber(true) validate output should support JSON numbers jsonErr := json.Unmarshal(outBuf.Bytes(), &ret) if jsonErr != nil { // the original call was possibly bad, if it has an error, actually just return that if err != nil { return nil, err } return nil, jsonErr } return &ret, nil }