driftctl/pkg/cmd/fmt.go

69 lines
1.5 KiB
Go
Raw Normal View History

2022-03-04 09:20:24 +00:00
package cmd
import (
"bufio"
"encoding/json"
"io"
"os"
"strings"
"github.com/pkg/errors"
"github.com/snyk/driftctl/pkg/analyser"
"github.com/spf13/cobra"
"github.com/snyk/driftctl/pkg"
"github.com/snyk/driftctl/pkg/cmd/scan/output"
)
func NewFmtCmd(opts *pkg.FmtOptions) *cobra.Command {
cmd := &cobra.Command{
Use: "fmt",
Long: "Take an analysis results in JSON on stdin and return it in another format",
Hidden: true,
Args: cobra.NoArgs,
PreRunE: func(cmd *cobra.Command, args []string) error {
outputFlag, _ := cmd.Flags().GetStringSlice("output")
if len(outputFlag) > 1 {
return errors.New("Only one output format can be set")
}
out, err := parseOutputFlags(outputFlag)
if err != nil {
return err
}
opts.Output = out[0]
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
return runFmt(opts, os.Stdin)
},
}
fl := cmd.Flags()
fl.StringSliceP(
"output",
"o",
[]string{output.Example(output.ConsoleOutputType)},
"Output format, by default it will write to the console\n"+
"Accepted formats are: "+strings.Join(output.SupportedOutputsExample(), ",")+"\n",
)
return cmd
}
func runFmt(opts *pkg.FmtOptions, reader io.Reader) error {
var analysisText []byte
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
analysisText = append(analysisText, scanner.Bytes()...)
}
analysis := analyser.NewAnalysis(analyser.AnalyzerOptions{})
err := json.Unmarshal(analysisText, analysis)
if err != nil {
return err
}
return output.GetOutput(opts.Output).Write(analysis)
}