github.com/anchore/syft@v1.38.2/internal/packagemetadata/generate/main.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  
     8  	"github.com/dave/jennifer/jen"
     9  
    10  	"github.com/anchore/syft/internal/packagemetadata"
    11  )
    12  
    13  // This program is invoked from syft/internal and generates packagemetadata/generated.go
    14  
    15  const (
    16  	pkgImport = "github.com/anchore/syft/syft/pkg"
    17  	path      = "packagemetadata/generated.go"
    18  )
    19  
    20  func main() {
    21  	typeNames, err := packagemetadata.DiscoverTypeNames()
    22  	if err != nil {
    23  		panic(fmt.Errorf("unable to get all metadata type names: %w", err))
    24  	}
    25  
    26  	// useful for debugging...
    27  	// for _, typeName := range typeNames {
    28  	//	fmt.Printf(" - %s\n", typeName)
    29  	//}
    30  
    31  	fmt.Printf("updating package metadata type list with %+v types\n", len(typeNames))
    32  
    33  	f := jen.NewFile("packagemetadata")
    34  	f.HeaderComment("DO NOT EDIT: generated by internal/packagemetadata/generate/main.go")
    35  	f.ImportName(pkgImport, "pkg")
    36  	f.Comment("AllTypes returns a list of all pkg metadata types that syft supports (that are represented in the pkg.Package.Metadata field).")
    37  
    38  	f.Func().Id("AllTypes").Params().Index().Any().BlockFunc(func(g *jen.Group) {
    39  		g.ReturnFunc(func(g *jen.Group) {
    40  			g.Index().Any().ValuesFunc(func(g *jen.Group) {
    41  				for _, typeName := range typeNames {
    42  					g.Qual(pkgImport, typeName).Values()
    43  				}
    44  			})
    45  		})
    46  	})
    47  
    48  	rendered := fmt.Sprintf("%#v", f)
    49  
    50  	fh, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    51  	if err != nil {
    52  		panic(fmt.Errorf("unable to open file: %w", err))
    53  	}
    54  
    55  	// fix a little whitespacing
    56  	rendered = strings.ReplaceAll(rendered, ",", ",\n")
    57  	rendered = strings.ReplaceAll(rendered, "[]any{", "[]any{\n")
    58  	rendered = strings.ReplaceAll(rendered, "}}\n}", "},\n}\n}")
    59  
    60  	_, err = fh.WriteString(rendered)
    61  	if err != nil {
    62  		panic(fmt.Errorf("unable to write file: %w", err))
    63  	}
    64  	if err := fh.Close(); err != nil {
    65  		panic(fmt.Errorf("unable to close file: %w", err))
    66  	}
    67  }