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
}