jx/internal/resource/package.go
Matthew Rich c4b7819713
Some checks failed
Lint / golangci-lint (push) Failing after 10m4s
Declarative Tests / test (push) Successful in 1m14s
add command helper
2024-04-05 10:22:17 -07:00

113 lines
2.1 KiB
Go

// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package resource
import (
"context"
"fmt"
"gopkg.in/yaml.v3"
_ "log"
"net/url"
_ "os"
_ "os/exec"
"io"
"path/filepath"
_ "strings"
)
type Package struct {
Name string `yaml:"name" json:"name"`
Version string `yaml:"version" json:"version"`
// state attributes
State string `yaml:"state"`
}
func init() {
ResourceTypes.Register("package", func(u *url.URL) Resource {
p := NewPackage()
return p
})
}
func NewPackage() *Package {
return &Package{}
}
func (p *Package) URI() string {
return fmt.Sprintf("package://%s?version=%s", p.Name, p.Version)
}
func (p *Package) SetURI(uri string) error {
resourceUri, e := url.Parse(uri)
if e == nil {
if resourceUri.Scheme == "package" {
p.Name = filepath.Join(resourceUri.Hostname(), resourceUri.RequestURI())
p.Version = resourceUri.Query().Get("version")
if p.Version == "" {
p.Version = "latest"
}
} else {
e = fmt.Errorf("%w: %s is not a package resource ", ErrInvalidResourceURI, uri)
}
}
return e
}
func (p *Package) ResolveId(ctx context.Context) string {
return ""
}
func (p *Package) Apply() error {
return nil
}
func (p *Package) Load(r io.Reader) error {
c := NewYAMLDecoder(r)
return c.Decode(p)
}
func (p *Package) LoadDecl(yamlResourceDeclaration string) error {
c := NewYAMLStringDecoder(yamlResourceDeclaration)
return c.Decode(p)
}
func (p *Package) Type() string { return "package" }
func (p *Package) Read(ctx context.Context) ([]byte, error) {
return yaml.Marshal(p)
}
func NewApkCreateCommand() *Command {
c := NewCommand()
c.Path = "apk"
c.Args = []CommandArg{
CommandArg("add"),
CommandArg("{{ .Name }}={{ .Version }}"),
}
return c
}
func NewApkReadCommand() *Command {
c := NewCommand()
c.Path = "apk"
c.Args = []CommandArg{
CommandArg("info"),
CommandArg("-ev"),
CommandArg("{{ .Name }}"),
}
return c
}
func NewApkDeleteCommand() *Command {
c := NewCommand()
c.Path = "apk"
c.Args = []CommandArg{
CommandArg("del"),
CommandArg("{{ .Name }}"),
}
return c
}