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  }