github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/snap/parse_snap_yaml.go (about) 1 package snap 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 8 "gopkg.in/yaml.v3" 9 10 "github.com/anchore/syft/syft/artifact" 11 "github.com/anchore/syft/syft/file" 12 "github.com/anchore/syft/syft/pkg" 13 "github.com/anchore/syft/syft/pkg/cataloger/generic" 14 ) 15 16 // snapYaml represents the structure of meta/snap.yaml files 17 type snapYaml struct { 18 Name string `yaml:"name"` 19 Version string `yaml:"version"` 20 Base string `yaml:"base"` 21 Type string `yaml:"type"` 22 Architecture string `yaml:"architecture"` 23 Summary string `yaml:"summary"` 24 Description string `yaml:"description"` 25 } 26 27 // parseSnapYaml parses meta/snap.yaml files to identify snap type and basic metadata 28 func parseSnapYaml(_ context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) { 29 var snap snapYaml 30 31 decoder := yaml.NewDecoder(reader) 32 if err := decoder.Decode(&snap); err != nil { 33 return nil, nil, fmt.Errorf("failed to parse snap.yaml: %w", err) 34 } 35 36 if snap.Name == "" { 37 return nil, nil, fmt.Errorf("snap.yaml missing required 'name' field") 38 } 39 40 // Determine snap type - default to "app" if not specified 41 snapType := snap.Type 42 if snapType == "" { 43 snapType = pkg.SnapTypeApp 44 } 45 46 metadata := pkg.SnapEntry{ 47 SnapType: snapType, 48 Base: snap.Base, 49 SnapName: snap.Name, 50 SnapVersion: snap.Version, 51 Architecture: snap.Architecture, 52 } 53 54 // Create a package representing the snap itself 55 snapPkg := newPackage( 56 snap.Name, 57 snap.Version, 58 metadata, 59 reader.Location, 60 ) 61 62 return []pkg.Package{snapPkg}, nil, nil 63 } 64 65 // readAll reads all content from a reader and returns it as bytes 66 func readAll(r io.Reader) ([]byte, error) { 67 return io.ReadAll(r) 68 }