func NewPackageFromFS()

in code/go/internal/packages/package.go [67:119]


func NewPackageFromFS(location string, fsys fs.FS) (*Package, error) {
	pkgManifestPath := "manifest.yml"
	_, err := fs.Stat(fsys, pkgManifestPath)
	if os.IsNotExist(err) {
		return nil, fmt.Errorf("no package manifest file found at path [%v]: %w", pkgManifestPath, err)
	}

	data, err := fs.ReadFile(fsys, pkgManifestPath)
	if err != nil {
		return nil, fmt.Errorf("could not read package manifest file [%v]", pkgManifestPath)
	}

	var manifest struct {
		Name        string `yaml:"name"`
		Type        string `yaml:"type"`
		Version     string `yaml:"version"`
		SpecVersion string `yaml:"format_version"`
	}
	if err := yaml.Unmarshal(data, &manifest); err != nil {
		return nil, fmt.Errorf("could not parse package manifest file [%v]: %w", pkgManifestPath, err)
	}

	if manifest.Type == "" {
		return nil, errors.New("package type undefined in the package manifest file")
	}

	if manifest.Version == "" {
		return nil, errors.New("package version undefined in the package manifest file")
	}

	packageVersion, err := semver.NewVersion(manifest.Version)
	if err != nil {
		return nil, fmt.Errorf("could not read package version from package manifest file [%v]: %w", pkgManifestPath, err)
	}

	specVersion, err := semver.NewVersion(manifest.SpecVersion)
	if err != nil {
		return nil, fmt.Errorf("could not read specification version from package manifest file [%v]: %w", manifest.SpecVersion, err)
	}

	// Instantiate Package object and return it
	p := Package{
		Name:        manifest.Name,
		Type:        manifest.Type,
		Version:     packageVersion,
		SpecVersion: specVersion,
		fs:          fsys,

		location: location,
	}

	return &p, nil
}