internal/artifact/package.go (44 lines of code) (raw):

package artifact import ( "context" "os/exec" ) // Package interface defines a package source // It defines the install, uninstall & upgrade commands to be executed type Package interface { // InstallCmd returns the command to install the package. // Every invocation guarantees a new command. InstallCmd(context.Context) *exec.Cmd // UninstallCmd returns the command to uninstall the package. // Every invocation guarantees a new command. UninstallCmd(context.Context) *exec.Cmd // UpgradeCmd return the command to upgrade the package // Every invocation guarantees a new command. UpgradeCmd(ctx context.Context) *exec.Cmd } type packageSource struct { installCmd Cmd uninstallCmd Cmd upgradeCmd Cmd } // Cmd represents a command to be executed. type Cmd struct { Path string Args []string } // Command returns a new exec.Cmd. func (c Cmd) Command(ctx context.Context) *exec.Cmd { return exec.CommandContext(ctx, c.Path, c.Args...) } // NewCmd returns a new Cmd. func NewCmd(path string, args ...string) Cmd { return Cmd{ Path: path, Args: args, } } func NewPackageSource(installCmd, uninstallCmd, upgradeCmd Cmd) Package { return &packageSource{ installCmd: installCmd, uninstallCmd: uninstallCmd, upgradeCmd: upgradeCmd, } } func (ps *packageSource) InstallCmd(ctx context.Context) *exec.Cmd { return ps.installCmd.Command(ctx) } func (ps *packageSource) UninstallCmd(ctx context.Context) *exec.Cmd { return ps.uninstallCmd.Command(ctx) } func (ps *packageSource) UpgradeCmd(ctx context.Context) *exec.Cmd { return ps.upgradeCmd.Command(ctx) }