opentofu/command/fmt.go
Dan Carley cc41c7cfa0 command/fmt: Add new fmt command
This uses the `fmtcmd` package which has recently been merged into HCL. Per
the usage text, this rewrites Terraform config files to their canonical
formatting and style.

Some notes about the implementation for this initial commit:

- all of the fmtcmd options are exposed as CLI flags
- it operates on all files that have a `.tf` suffix
- it currently only operates on the working directory and doesn't accept a
  directory argument, but I'll extend this in subsequent commits
- output is proxied through `cli.UiWriter` so that we write in the same way
  as other commands and we can capture the output during tests
- the test uses a very simple fixture just to ensure that it is working
  correctly end-to-end; the fmtcmd package has more exhaustive tests
- we have to write the fixture to a file in a temporary directory because it
  will be modified and for this reason it was easier to define the fixture
  contents as a raw string
2016-03-07 15:07:04 +00:00

76 lines
1.6 KiB
Go

package command
import (
"flag"
"fmt"
"strings"
"github.com/hashicorp/hcl/hcl/fmtcmd"
"github.com/mitchellh/cli"
)
const (
fileExtension = "tf"
)
// FmtCommand is a Command implementation that rewrites Terraform config
// files to a canonical format and style.
type FmtCommand struct {
Meta
opts fmtcmd.Options
}
func (c *FmtCommand) Run(args []string) int {
args = c.Meta.process(args, false)
cmdFlags := flag.NewFlagSet("fmt", flag.ContinueOnError)
cmdFlags.BoolVar(&c.opts.List, "list", false, "list")
cmdFlags.BoolVar(&c.opts.Write, "write", false, "write")
cmdFlags.BoolVar(&c.opts.Diff, "diff", false, "diff")
cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
if err := cmdFlags.Parse(args); err != nil {
return 1
}
args = cmdFlags.Args()
if len(args) > 0 {
c.Ui.Error("The fmt command expects no arguments.")
cmdFlags.Usage()
return 1
}
dir := "."
output := &cli.UiWriter{Ui: c.Ui}
err := fmtcmd.Run([]string{dir}, []string{fileExtension}, nil, output, c.opts)
if err != nil {
c.Ui.Error(fmt.Sprintf("Error running fmt: %s", err))
return 2
}
return 0
}
func (c *FmtCommand) Help() string {
helpText := `
Usage: terraform fmt [options]
Rewrites all Terraform configuration files in the current working
directory to a canonical format.
Options:
-list List files whose formatting differs
-write Write result to source file instead of STDOUT
-diff Display diffs instead of rewriting files
`
return strings.TrimSpace(helpText)
}
func (c *FmtCommand) Synopsis() string {
return "Rewrites config files to canonical format"
}