posh/embed/scaffold/init/$.posh/pkg/plugin.go.gotext
2023-01-12 07:30:12 +01:00

136 lines
3.2 KiB
Plaintext

package pkg
import (
"context"
"fmt"
"strings"
pkgcommand "{{.module}}/posh/pkg/command"
"github.com/foomo/fender/fend"
"github.com/foomo/posh/pkg/command"
"github.com/foomo/posh/pkg/config"
"github.com/foomo/posh/pkg/log"
"github.com/foomo/posh/integration/ownbrew"
"github.com/foomo/posh/pkg/plugin"
"github.com/foomo/posh/pkg/prompt"
"github.com/foomo/posh/pkg/prompt/check"
"github.com/foomo/posh/pkg/prompt/history"
"github.com/foomo/posh/pkg/readline"
"github.com/foomo/posh/pkg/require"
"github.com/spf13/viper"
)
type Plugin struct {
l log.Logger
commands command.Commands
}
// ------------------------------------------------------------------------------------------------
// ~ Constructor
// ------------------------------------------------------------------------------------------------
func New(l log.Logger) (plugin.Plugin, error) {
inst := &Plugin{
l: l,
commands: command.Commands{},
}
// add commands
inst.commands.Add(
command.NewExit(l),
command.NewHelp(l, inst.commands),
)
// Welcome
if cmd, err := pkgcommand.NewWelcome(l,
pkgcommand.WelcomeWithConfigKey("welcome"),
); err != nil {
return nil, err
} else {
inst.commands.Add(cmd)
}
return inst, nil
}
// ------------------------------------------------------------------------------------------------
// ~ Public methods
// ------------------------------------------------------------------------------------------------
func (p *Plugin) Brew(ctx context.Context, cfg config.Ownbrew) error {
brew, err := ownbrew.New(p.l,
ownbrew.WithDry(cfg.Dry),
ownbrew.WithBinDir(cfg.BinDir),
ownbrew.WithTapDir(cfg.TapDir),
ownbrew.WithTempDir(cfg.TempDir),
ownbrew.WithCellarDir(cfg.CellarDir),
ownbrew.WithPackages(cfg.Packages...),
)
if err != nil {
return err
}
return brew.Install(ctx)
}
func (p *Plugin) Require(ctx context.Context, cfg config.Require) error {
return require.First(p.l,
require.Envs(p.l, cfg.Envs),
require.Packages(ctx, p.l, cfg.Packages),
require.Scripts(ctx, p.l, cfg.Scripts),
)
}
func (p *Plugin) Execute(ctx context.Context, args []string) error {
r, err := readline.New(p.l)
if err != nil {
return err
}
if err := r.Parse(strings.Join(args, " ")); err != nil {
return err
}
if cmd := p.commands.Get(r.Cmd()); cmd == nil {
return fmt.Errorf("invalid [cmd] argument: %s", r.Cmd())
} else {
if value, ok := cmd.(command.Validator); ok {
if err := value.Validate(ctx, r); err != nil {
return err
}
}
if err := cmd.Execute(ctx, r); err != nil {
return err
}
}
return nil
}
func (p *Plugin) Prompt(ctx context.Context, cfg config.Prompt) error {
sh, err := prompt.New(p.l,
prompt.WithTitle(cfg.Title),
prompt.WithPrefix(cfg.Prefix),
prompt.WithContext(ctx),
prompt.WithCommands(p.commands),
prompt.WithCheckers(
func(ctx context.Context, l log.Logger) check.Info {
return check.Info{
Name: "example",
Note: "all good",
Status: check.StatusSuccess,
}
},
),
prompt.WithFileHistory(
history.FileWithLimit(cfg.History.Limit),
history.FileWithFilename(cfg.History.Filename),
history.FileWithLockFilename(cfg.History.LockFilename),
),
)
if err != nil {
return err
}
return sh.Run()
}