jx/internal/source/package.go

69 lines
1.7 KiB
Go
Raw Normal View History

2024-07-01 07:16:55 +00:00
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package source
import (
_ "context"
_ "encoding/json"
_ "fmt"
_ "gopkg.in/yaml.v3"
"net/url"
_ "path/filepath"
"decl/internal/resource"
_ "os"
_ "io"
"log/slog"
)
type Package struct {
PackageType resource.PackageType `yaml:"type" json:"type"`
}
func NewPackage() *Package {
return &Package{ PackageType: resource.SystemPackageType }
}
func init() {
SourceTypes.Register([]string{"package"}, func(u *url.URL) DocSource {
p := NewPackage()
2024-07-17 08:34:57 +00:00
packageType := u.Query().Get("type")
if len(packageType) > 0 {
p.PackageType = resource.PackageType(packageType)
}
2024-07-01 07:16:55 +00:00
return p
})
}
func (p *Package) Type() string { return "package" }
func (p *Package) ExtractResources(filter ResourceSelector) ([]*resource.Document, error) {
documents := make([]*resource.Document, 0, 100)
slog.Info("package source ExtractResources()", "package", p)
installedPackages := make([]*resource.Package, 0, 100)
cmd := p.PackageType.NewReadPackagesCommand()
2024-07-17 08:34:57 +00:00
if cmd == nil {
return documents, resource.ErrUnsupportedPackageType
}
2024-07-01 07:16:55 +00:00
if out, err := cmd.Execute(p); err == nil {
slog.Info("package source ExtractResources()", "output", out)
if exErr := cmd.Extractor(out, &installedPackages); exErr != nil {
return documents, exErr
}
document := resource.NewDocument()
for _, pkg := range installedPackages {
if pkg == nil {
pkg = resource.NewPackage()
}
pkg.PackageType = p.PackageType
document.AddResourceDeclaration("package", pkg)
}
documents = append(documents, document)
} else {
slog.Info("package source ExtractResources()", "output", out, "error", err)
return documents, err
}
return documents, nil
}