Added opt:set

This commit is contained in:
Leon Mika 2025-05-26 21:20:46 +10:00
parent cae7509a76
commit 76dce52a86
10 changed files with 108 additions and 26 deletions

View file

@ -170,9 +170,13 @@ func main() {
exportController, exportController,
keyBindingController, keyBindingController,
pasteboardProvider, pasteboardProvider,
settingsController,
) )
commandController := commandctrl.NewCommandController(inputHistoryService, stdCommands) commandController, err := commandctrl.NewCommandController(inputHistoryService, stdCommands)
if err != nil {
cli.Fatalf("cannot setup command controller: %v", err)
}
//commandController.AddCommandLookupExtension(scriptController) //commandController.AddCommandLookupExtension(scriptController)
commandController.SetCommandCompletionProvider(columnsController) commandController.SetCommandCompletionProvider(columnsController)

View file

@ -0,0 +1,47 @@
package cmdpacks
import (
"context"
"github.com/lmika/dynamo-browse/internal/common/ui/commandctrl"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/controllers"
"ucl.lmika.dev/ucl"
)
type optModule struct {
settingsController *controllers.SettingsController
}
func (m optModule) pbSet(ctx context.Context, args ucl.CallArgs) (any, error) {
var (
name string
newVale string
)
if args.NArgs() == 1 {
if err := args.Bind(&name); err != nil {
return nil, err
}
} else {
if err := args.Bind(&name, &newVale); err != nil {
return nil, err
}
}
commandctrl.PostMsg(ctx, m.settingsController.SetSetting(name, newVale))
return nil, nil
}
func moduleOpt(
settingsController *controllers.SettingsController,
) ucl.Module {
m := &optModule{
settingsController: settingsController,
}
return ucl.Module{
Name: "opt",
Builtins: map[string]ucl.BuiltinHandler{
"set": m.pbSet,
},
}
}

View file

@ -2,12 +2,12 @@ package cmdpacks
import ( import (
"context" "context"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/providers/pasteboardprovider" "github.com/lmika/dynamo-browse/internal/dynamo-browse/services"
"ucl.lmika.dev/ucl" "ucl.lmika.dev/ucl"
) )
type pbModule struct { type pbModule struct {
pasteboardProvider *pasteboardprovider.Provider pasteboardProvider services.PasteboardProvider
} }
func (m pbModule) pbGet(ctx context.Context, args ucl.CallArgs) (any, error) { func (m pbModule) pbGet(ctx context.Context, args ucl.CallArgs) (any, error) {
@ -30,7 +30,7 @@ func (m pbModule) pbPut(ctx context.Context, args ucl.CallArgs) (any, error) {
} }
func modulePB( func modulePB(
pasteboardProvider *pasteboardprovider.Provider, pasteboardProvider services.PasteboardProvider,
) ucl.Module { ) ucl.Module {
m := &pbModule{ m := &pbModule{
pasteboardProvider: pasteboardProvider, pasteboardProvider: pasteboardProvider,

View file

@ -6,7 +6,7 @@ import (
"github.com/lmika/dynamo-browse/internal/common/ui/commandctrl" "github.com/lmika/dynamo-browse/internal/common/ui/commandctrl"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/controllers" "github.com/lmika/dynamo-browse/internal/dynamo-browse/controllers"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/models" "github.com/lmika/dynamo-browse/internal/dynamo-browse/models"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/providers/pasteboardprovider" "github.com/lmika/dynamo-browse/internal/dynamo-browse/services"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/services/tables" "github.com/lmika/dynamo-browse/internal/dynamo-browse/services/tables"
"github.com/pkg/errors" "github.com/pkg/errors"
"ucl.lmika.dev/repl" "ucl.lmika.dev/repl"
@ -20,7 +20,8 @@ type StandardCommands struct {
WriteController *controllers.TableWriteController WriteController *controllers.TableWriteController
ExportController *controllers.ExportController ExportController *controllers.ExportController
KeyBindingController *controllers.KeyBindingController KeyBindingController *controllers.KeyBindingController
PBProvider *pasteboardprovider.Provider PBProvider services.PasteboardProvider
SettingsController *controllers.SettingsController
modUI ucl.Module modUI ucl.Module
} }
@ -32,7 +33,8 @@ func NewStandardCommands(
writeController *controllers.TableWriteController, writeController *controllers.TableWriteController,
exportController *controllers.ExportController, exportController *controllers.ExportController,
keyBindingController *controllers.KeyBindingController, keyBindingController *controllers.KeyBindingController,
pbProvider *pasteboardprovider.Provider, pbProvider services.PasteboardProvider,
settingsController *controllers.SettingsController,
) StandardCommands { ) StandardCommands {
modUI, ckbs := moduleUI(tableService, state, readController) modUI, ckbs := moduleUI(tableService, state, readController)
keyBindingController.SetCustomKeyBindingSource(ckbs) keyBindingController.SetCustomKeyBindingSource(ckbs)
@ -45,6 +47,7 @@ func NewStandardCommands(
ExportController: exportController, ExportController: exportController,
KeyBindingController: keyBindingController, KeyBindingController: keyBindingController,
PBProvider: pbProvider, PBProvider: pbProvider,
SettingsController: settingsController,
modUI: modUI, modUI: modUI,
} }
} }
@ -394,6 +397,7 @@ func (sc StandardCommands) InstOptions() []ucl.InstOption {
ucl.WithModule(moduleRS(sc.TableService, sc.State)), ucl.WithModule(moduleRS(sc.TableService, sc.State)),
ucl.WithModule(sc.modUI), ucl.WithModule(sc.modUI),
ucl.WithModule(modulePB(sc.PBProvider)), ucl.WithModule(modulePB(sc.PBProvider)),
ucl.WithModule(moduleOpt(sc.SettingsController)),
} }
} }
@ -402,7 +406,6 @@ func (sc StandardCommands) ConfigureUCL(ucl *ucl.Inst) {
ucl.SetBuiltin("table", sc.cmdTable) ucl.SetBuiltin("table", sc.cmdTable)
ucl.SetBuiltin("export", sc.cmdExport) ucl.SetBuiltin("export", sc.cmdExport)
ucl.SetBuiltin("mark", sc.cmdMark) ucl.SetBuiltin("mark", sc.cmdMark)
// unmark --> alias for { mark none }
ucl.SetBuiltin("next-page", sc.cmdNextPage) ucl.SetBuiltin("next-page", sc.cmdNextPage)
ucl.SetBuiltin("delete", sc.cmdDelete) ucl.SetBuiltin("delete", sc.cmdDelete)
ucl.SetBuiltin("new-item", sc.cmdNewItem) ucl.SetBuiltin("new-item", sc.cmdNewItem)
@ -413,9 +416,18 @@ func (sc StandardCommands) ConfigureUCL(ucl *ucl.Inst) {
ucl.SetBuiltin("touch", sc.cmdTouch) ucl.SetBuiltin("touch", sc.cmdTouch)
ucl.SetBuiltin("noisy-touch", sc.cmdNoisyTouch) ucl.SetBuiltin("noisy-touch", sc.cmdNoisyTouch)
ucl.SetBuiltin("rebind", sc.cmdRebind) ucl.SetBuiltin("rebind", sc.cmdRebind)
// set-opt --> alias to opts:set
ucl.SetPseudoVar("resultset", resultSetPVar{sc.State, sc.ReadController}) ucl.SetPseudoVar("resultset", resultSetPVar{sc.State, sc.ReadController})
ucl.SetPseudoVar("table", tablePVar{sc.State}) ucl.SetPseudoVar("table", tablePVar{sc.State})
ucl.SetPseudoVar("item", itemPVar{sc.State}) ucl.SetPseudoVar("item", itemPVar{sc.State})
} }
func (sc StandardCommands) RunPrelude(ctx context.Context, ucl *ucl.Inst) error {
_, err := ucl.EvalString(ctx, uclPrelude)
return err
}
const uclPrelude = `
ui:command unmark { mark none }
ui:command set-opt { |n k| opt:set $n $k }
`

View file

@ -137,9 +137,17 @@ func newService(t *testing.T, opts ...serviceOpt) *services {
keyBindingService := keybindings_service.NewService(keybindings.Default()) keyBindingService := keybindings_service.NewService(keybindings.Default())
keyBindingController := controllers.NewKeyBindingController(keyBindingService, nil) keyBindingController := controllers.NewKeyBindingController(keyBindingService, nil)
_ = settingsController commandController, _ := commandctrl.NewCommandController(inputHistoryService,
commandController := commandctrl.NewCommandController(inputHistoryService, cmdpacks.NewStandardCommands(
cmdpacks.NewStandardCommands(service, state, readController, writeController, exportController, keyBindingController), service,
state,
readController,
writeController,
exportController,
keyBindingController,
pasteboardprovider.NilProvider{},
settingsController,
),
) )
s.State = state s.State = state

View file

@ -35,7 +35,7 @@ type CommandController struct {
interactive bool interactive bool
} }
func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) *CommandController { func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) (*CommandController, error) {
cc := &CommandController{ cc := &CommandController{
historyProvider: historyProvider, historyProvider: historyProvider,
commandList: nil, commandList: nil,
@ -60,9 +60,17 @@ func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) *Co
pkg.ConfigureUCL(cc.uclInst) pkg.ConfigureUCL(cc.uclInst)
} }
execCtx := execContext{ctrl: cc}
ctx := context.WithValue(context.Background(), commandCtlKey, &execCtx)
for _, pkg := range pkgs {
if err := pkg.RunPrelude(ctx, cc.uclInst); err != nil {
return nil, err
}
}
go cc.cmdLooper() go cc.cmdLooper()
return cc return cc, nil
} }
func (c *CommandController) AddCommands(ctx *CommandList) { func (c *CommandController) AddCommands(ctx *CommandList) {

View file

@ -12,7 +12,8 @@ import (
func TestCommandController_Prompt(t *testing.T) { func TestCommandController_Prompt(t *testing.T) {
t.Run("prompt user for a command", func(t *testing.T) { t.Run("prompt user for a command", func(t *testing.T) {
cmd := commandctrl.NewCommandController(mockIterProvider{}) cmd, err := commandctrl.NewCommandController(mockIterProvider{})
assert.NoError(t, err)
res := cmd.Prompt() res := cmd.Prompt()

View file

@ -1,8 +1,12 @@
package commandctrl package commandctrl
import "ucl.lmika.dev/ucl" import (
"context"
"ucl.lmika.dev/ucl"
)
type CommandPack interface { type CommandPack interface {
InstOptions() []ucl.InstOption InstOptions() []ucl.InstOption
ConfigureUCL(ucl *ucl.Inst) ConfigureUCL(ucl *ucl.Inst)
RunPrelude(ctx context.Context, ucl *ucl.Inst) error
} }

View file

@ -636,7 +636,7 @@ func newService(t *testing.T, cfg serviceConfig) *services {
exportController := controllers.NewExportController(state, service, jobsController, columnsController, pasteboardprovider.NilProvider{}) exportController := controllers.NewExportController(state, service, jobsController, columnsController, pasteboardprovider.NilProvider{})
scriptController := controllers.NewScriptController(scriptService, readController, jobsController, settingsController, eventBus) scriptController := controllers.NewScriptController(scriptService, readController, jobsController, settingsController, eventBus)
commandController := commandctrl.NewCommandController(inputHistoryService) commandController, _ := commandctrl.NewCommandController(inputHistoryService)
commandController.AddCommandLookupExtension(scriptController) commandController.AddCommandLookupExtension(scriptController)
if cfg.isReadOnly { if cfg.isReadOnly {

View file

@ -40,7 +40,6 @@ type Model struct {
settingsController *controllers.SettingsController settingsController *controllers.SettingsController
exportController *controllers.ExportController exportController *controllers.ExportController
commandController *commandctrl.CommandController commandController *commandctrl.CommandController
//scriptController *controllers.ScriptController
jobController *controllers.JobsController jobController *controllers.JobsController
colSelector *colselector.Model colSelector *colselector.Model
relSelector *relselector.Model relSelector *relselector.Model
@ -68,7 +67,6 @@ func NewModel(
jobController *controllers.JobsController, jobController *controllers.JobsController,
itemRendererService *itemrenderer.Service, itemRendererService *itemrenderer.Service,
cc *commandctrl.CommandController, cc *commandctrl.CommandController,
//scriptController *controllers.ScriptController,
eventBus *bus.Bus, eventBus *bus.Bus,
keyBindingController *controllers.KeyBindingController, keyBindingController *controllers.KeyBindingController,
pasteboardProvider services.PasteboardProvider, pasteboardProvider services.PasteboardProvider,