github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/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/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  	// for _, typeName := range typeNames {
    27  	//	fmt.Printf(" - %s\n", typeName)
    28  	//}
    29  
    30  	fmt.Printf("updating package metadata type list with %+v types\n", len(typeNames))
    31  
    32  	f := jen.NewFile("packagemetadata")
    33  	f.HeaderComment("DO NOT EDIT: generated by syft/internal/packagemetadata/generate/main.go")
    34  	f.ImportName(pkgImport, "pkg")
    35  	f.Comment("AllTypes returns a list of all pkg metadata types that syft supports (that are represented in the pkg.Package.Metadata field).")
    36  
    37  	f.Func().Id("AllTypes").Params().Index().Any().BlockFunc(func(g *jen.Group) {
    38  		g.ReturnFunc(func(g *jen.Group) {
    39  			g.Index().Any().ValuesFunc(func(g *jen.Group) {
    40  				for _, typeName := range typeNames {
    41  					g.Qual(pkgImport, typeName).Values()
    42  				}
    43  			})
    44  		})
    45  	})
    46  
    47  	rendered := fmt.Sprintf("%#v", f)
    48  
    49  	fh, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
    50  	if err != nil {
    51  		panic(fmt.Errorf("unable to open file: %w", err))
    52  	}
    53  
    54  	// fix a little whitespacing
    55  	rendered = strings.ReplaceAll(rendered, ",", ",\n")
    56  	rendered = strings.ReplaceAll(rendered, "[]any{", "[]any{\n")
    57  	rendered = strings.ReplaceAll(rendered, "}}\n}", "},\n}\n}")
    58  
    59  	_, err = fh.WriteString(rendered)
    60  	if err != nil {
    61  		panic(fmt.Errorf("unable to write file: %w", err))
    62  	}
    63  	if err := fh.Close(); err != nil {
    64  		panic(fmt.Errorf("unable to close file: %w", err))
    65  	}
    66  }