dnscontrol/commands/fmt.go
Tom Limoncelli 05eade15c6
CHORE: Upgrade to github.com/urfave/cli/v3 (#3948)
# Issue

We're using github.com/urfave/cli/v2

# Resolution

Upgrade to github.com/urfave/cli/v3
2026-01-06 18:03:53 -05:00

106 lines
2.2 KiB
Go

package commands
import (
"context"
"fmt"
"io"
"os"
"strings"
"github.com/ditashi/jsbeautifier-go/jsbeautifier"
"github.com/urfave/cli/v3"
)
var _ = cmd(catUtils, func() *cli.Command {
var args FmtArgs
return &cli.Command{
Name: "fmt",
Usage: "[BETA] Format and prettify a given file",
Action: func(ctx context.Context, c *cli.Command) error {
return exit(FmtFile(args))
},
Flags: args.flags(),
}
}())
// FmtArgs stores arguments related to the fmt subcommand.
type FmtArgs struct {
InputFile string
OutputFile string
Verbose bool
}
func (args *FmtArgs) flags() []cli.Flag {
var flags []cli.Flag
flags = append(flags, &cli.StringFlag{
Name: "input",
Aliases: []string{"i"},
Value: "dnsconfig.js",
Usage: "Input file",
Destination: &args.InputFile,
})
flags = append(flags, &cli.StringFlag{
Name: "output",
Aliases: []string{"o"},
Value: "dnsconfig.js",
Usage: "Output file",
Destination: &args.OutputFile,
})
flags = append(flags, &cli.BoolFlag{
Name: "verbose",
Aliases: []string{"v"},
Value: false,
Usage: "Enable verbose output",
Destination: &args.Verbose,
})
return flags
}
// FmtFile reads and formats a file.
func FmtFile(args FmtArgs) error {
var fileBytes []byte
if args.InputFile == "" {
var err error
fileBytes, err = io.ReadAll(os.Stdin)
if err != nil {
return err
}
} else {
var err error
fileBytes, err = os.ReadFile(args.InputFile)
if err != nil {
return err
}
}
original := string(fileBytes)
opts := jsbeautifier.DefaultOptions()
beautified, beautifyErr := jsbeautifier.Beautify(&original, opts)
if beautifyErr != nil {
return beautifyErr
}
beautified = strings.TrimSpace(beautified)
if len(beautified) != 0 {
beautified = beautified + "\n"
}
if args.OutputFile == "" {
fmt.Print(beautified)
} else {
changed := original != beautified
if changed {
if err := os.WriteFile(args.OutputFile, []byte(beautified), 0o744); err != nil {
return err
}
}
if args.Verbose || changed {
if changed {
fmt.Fprintf(os.Stderr, "%s (formatted)\n", args.OutputFile)
} else {
fmt.Fprintf(os.Stderr, "%s (unchanged)\n", args.OutputFile)
}
}
}
return nil
}