github.com/w3security/vervet/v5@v5.3.1-0.20230618081846-5bd9b5d799dc/internal/cmd/resolve.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 6 "github.com/urfave/cli/v2" 7 8 "github.com/w3security/vervet/v5" 9 ) 10 11 // ResolveCommand is the `vervet resolve` subcommand. 12 var ResolveCommand = cli.Command{ 13 Name: "resolve", 14 Usage: "Aggregate, render and validate resource specs at a particular version", 15 ArgsUsage: "[resource root]", 16 Flags: []cli.Flag{ 17 &cli.StringFlag{Name: "at"}, 18 }, 19 Action: Resolve, 20 } 21 22 // Resolve aggregates, renders and validates resource specs at a particular 23 // version. 24 func Resolve(ctx *cli.Context) error { 25 specDir, err := absPath(ctx.Args().Get(0)) 26 if err != nil { 27 return err 28 } 29 specVersions, err := vervet.LoadSpecVersions(specDir) 30 if err != nil { 31 return err 32 } 33 version, err := vervet.ParseVersion(ctx.String("at")) 34 if err != nil { 35 return err 36 } 37 specVersion, err := specVersions.At(version) 38 if err != nil { 39 return err 40 } 41 42 yamlBuf, err := vervet.ToSpecYAML(specVersion) 43 if err != nil { 44 return fmt.Errorf("failed to convert JSON to YAML: %w", err) 45 } 46 fmt.Println(string(yamlBuf)) 47 48 err = specVersion.Validate(ctx.Context) 49 if err != nil { 50 return fmt.Errorf("error: spec validation failed: %w", err) 51 } 52 return nil 53 }